深入理解 C++权限管理

2023-03-28 21:35:26 浏览数 (1)

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其实也实现了权限管理 连自己

0 人点赞