C++(类成员的访问控制)

 


访问控制

如下代码,Student这个类的所有成员我们都可以调用,但是我们不想让被人调用Print1这个方法该怎么?

struct Student {
 int age;
 int sex;

 void Print1() {
 printf("Func Print1");
 }

 void Print() {
 printf("Func Print");
 }
};

这里我们可以使用关键词:private、public来控制我们想被人访问的和不想被人访问的成员:

struct Student {
 private:
   void Print1() {
   printf("Func Print1");
   }

 public:
   int age;
   int sex;
   void Print() {
   printf("Func Print");
   }
};

当我们调用Print1的时候就会发现无法编译:

private(私有)、public(公有)的使用总结:

  1. 对外提供的函数或者变量,定义成public,不能随意改动
  2. 可能会改动的函数或者变量,定义成private,使用时编译器会检测
  3. 只有当前结构体内部函数才可以访问private的成员
  4. private、public可以修饰函数或者变量

那么问题来了,private修饰的函数或者变量真的不能访问吗?并不是,只是我们没有办法通过正常的方式去使
用,但是我们可以使用指针的方式去调用:

那就说明private修饰的成员与普通成员没有区别,只有编译器会检测。
从这节课开始我们不再使用struct作为类的创建,而是直接使用class关键词,其使用没有什么区别,唯一的区
别在于成员默认访问属性不一样,在struct中所有成员默认的属性是public,而在class中则相反:

除此之外还有一个就是在继承时的区别,我们可以将一个正常的struct继承修改成class:

class A {
 public: 
 int x;
 int y;
 };

 class B:A {
 public:
 int v;
 int n;
};

当我们创建对象调用的时候却无法编译:

这是因为在继承的时候默认将继承过来的A的所有成员设置为private,也就是如下代码:

class A {
 public: 
 int x;
 int y;
 };

 class B:A {
 public:
 int v;
 int n;
};

而我们想要外部可以调用可以将private修改成public。最后一个问题:私有成员是否会被继承?

class A {
 private:
 int x;

 public:
 int y;
 };

 class B:public A {
 public:
 int v;
 int n;
 };
以上代码B继承了A,这里A前面的public代表着,按照A的成员定义的属性继承过来,公有就是公有,私有就是
私有。而在这里我们想要确认B有没有继承A的私有成员,有2个方法:
1.查看数据宽度,显示为16

![](https://img2022.cnblogs.com/blog/2069956/202205/2069956-20220526113943258-1415386980.png)

2.指针方式调用,可以成功调用获取到值
![](https://img2022.cnblogs.com/blog/2069956/202205/2069956-20220526114110908-1388953256.png)

所以我们得出最终结论:父类的私有成员是可以被继承的,但是也不能直接访问。

本文作者:不会笑的孩子

本文链接:https://www.cnblogs.com/doubleconquer/p/16312946.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   不会笑的孩子  阅读(49)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.