Public, Private, Protect
一文看懂C++ public, private, protect => 参考
语义
- Private表达的语义是**“只有我知道这些秘密”**。
- Protect表达的语义是**“为父有一部分秘密愿意与我的孩子共享,但是我的孩子也要一起保护这个秘密。为父愿意与你共享,但你要把这个秘密当成Private”**
- Public表达的语义是**“这是完全公开的”**。
从上面可以看出:
- Private的权限管理是极严苛的,仅允许自己类的成员函数内访问,子类中的成员函数都不能访问。
- Public的权限管理是极宽容的,信任所有人。
- Protect介于两者之间,相当于开了白名单,仅信任子类内部,不信任其他。相当于父类的Protect成员被子类当成Private处理。
Protect引入的矛盾
- 矛盾一:父类Protect成员 + 子类对父类Private继承。其矛盾在于,Protect就是为了让父亲和孩子一起守护秘密,但是Private是只允许我自己知道秘密。可以猜测其使用场景是,龙生九子各有不同,对一部分孩子,父亲愿意共享秘密,对另一部分孩子,父亲仍保持戒备。
- 矛盾二:父类Public成员 + 子类对父类Protect继承。其矛盾在于,父类Public就表明父类对外完全公开了,但是Protect表达了父类要子类保护自己的Public。其效果是父类对象可以随意访问其Public成员,子类对象不可以随意访问父类的Public成员。意义何在呢?
Friend友元类和友元函数
- 语义:“虽然你不是我的孩子(非继承关系),但我信任你(允许访问private),你不能告诉别人(友元关系不能传递)”。
- 和 Protect 相比,友元类提供了 非子类 能访问 private的可能。
从 Struct 到 Class
- Struct中虽然也可以使用private关键字,但是如果没有明确用private标识,成员变量默认是public权限。
- Class中,如果没有明确使用public标识,成员变量默认是private权限。
- 从Struct到Class,可以看出C++的权限管理更加严谨。
启发
对外暴露的越少,内部修改越自由。因为不用担心企图修改的对象已经被外部用到了。
所以要写尽量多的黑盒。
Static
Const
const其实也实现了权限管理 连自己