C++面向对象编程,设计一个类的时候,Public Private Protected 怎么使用,分别用来修饰什么变量或方法?——来自 C++初学者
1
monetto 2022-08-08 10:37:40 +08:00
说实话,无论程序怎么设计都可以跑,即使语言自身没有提供这些修饰符,能做的事也一个不少。
但是这三个的作用感觉在语义化上。比如 Public 表示这个成员或者方法可以被外部发现访问,而 Private 表示外界无需访问也不允许访问。 例如说 我有一个函数 作用是 返回一个数 x2 ,那么我的函数可以这样写。 Public doubleNum (int num) { return self.doubleAdd(num); } Private doubleAdd (int num) { return num + num; } 这里的 doubleAdd 可以写成 num * 2 也可以写成 num + num 。 这个是外界不需要关心的。 外界只需要知道,我可以调用你的 doubleNum 来实现一个数 * 2 ,但是我不关心你怎么实现的。 还有一个场景,比如,一个对象有两个变量,我想让其中一个变量发生变化时,另外一个变量 + 1 。 Public int a = 0; Public int b = 0; 正常来写的话,外界只需要调用 obj.a = 1; obj.b += 1; 但是一旦外界忘记调用 obj.b += 1 时,程序就会发生异常。 而且很多时候,外界不需要关心这个 b ,所以可以这样封装。 Private int a = 0; Private int b = 0; Public setA (int num) { self.a = num; self.b += 1; } Protected 同理,类似的。只不过添加了 子类 可以改变 父类 这个规则。 |
2
LLPikaPika OP 嗯嗯,收获满满
|
3
listenerri 2022-08-08 11:49:08 +08:00 2
如果不确定的话,可以先用 private ,等需要用到时,就发现原来这个需要是 protected / public ,不得不说这是一个稍稍笨 /慢一些的方法,但可以让人从实践中去理解锻炼或者说纠正思路。
先上手然后再慢慢理清楚 vs 先弄清楚然后再动手。(我偏好后者) |
4
lanlanye 2022-08-08 14:02:52 +08:00
同意楼上,先全都 private ,需要的时候再去改
|
5
mingl0280 2022-08-08 14:19:20 +08:00 via Android
C++中,public private protected 是当你的类需要给别人用的时候,用来提供封装性,确保其他人不会误用的。
例如:一个类中,有二十个函数,其中五个是你想直接暴露给其他人的(public),剩下的十个是你自己用的(private),还有五个是你想让用这个类的人自己处理的(protected)。 |
6
mirrorman 2022-08-08 16:02:24 +08:00
is-A 用 public ,父类不想被多态使用则将析构函数设为 no-virtual protected ,否则设为 public virtual ;如果子类只被多态使用,将父类的 virtual 接口设为 public 且将子类的 override 设为 private
has-A 或者 implement by A 用 private |
7
hu8245 2022-08-08 17:24:19 +08:00
自己用,private ,可能给其他类用,public ,只给好朋友还有儿子用,protected
|
8
cwaken 2022-08-08 23:49:09 +08:00 via iPhone
google 代码规范里写的比较清楚
|
9
nightwitch 2022-08-09 01:24:55 +08:00
如果你不知道,那就用 public
|
10
cnbatch 2022-08-09 06:27:48 +08:00
先说最普通的单独一个类(无任何继承)。
为了方便 OP 理解,我直接在类里面使用中文。 class unique_class { public: double 外界可以直接访问的变量; double 可以给外界访问的函数 1() { return 外界无法访问的函数_protected(); }; double 可以给外界访问的函数 2() { return 外界无法访问的函数_private(); }; protected: double 外界无法访问的变量_protected; double 外界无法访问的函数_protected() {return 外界无法访问的变量_protected * 2; } private: double 外界无法访问的变量_private; double 外界无法访问的函数_private() {return 外界无法访问的变量_private * 2; } } 可以看到,这个 unique_class 不继承自任意一个基类 /派生类,而且这里假设它也不会被其他类所继承。 在这种情况下,无论用 protected 还是 private 都没区别,想用哪个都行。而且 class 默认就是 private ,所以完全可以直接把所有不需要被外界访问的内容全部写在前头,随后需要外界访问的再写在“public:”后方即可。当然了,明明白白写清楚 public private 没坏处。 而基类、派生类的情况,就如同大家所言了。7L 很形象。 对于基类而言,如果既不想基类的内部资源被派生类访问,也不想被外部访问,那就用 private ; 如果只是不想被外部访问,而需要派生类能够访问,那就用 protected ; 如果可以既能被派生类使用,又能被外部随意访问,那就写 public 。 至于派生类继承基类的 public protected private ,其实也是类似,虽然 OP 没问。 实际使用时可以如 3L 所言,先用 private ,有需要时再改。 为了便于 OP 以后搜索资料,在这里多说一句:在 C++惯用语当中,使用的是“基类”(base class)和“派生类”(derived class),虽然也有人用“父类”(parent class)和“子类”(child class),不过前者能够搜得出的资料相对更好一些。 |
11
apake 2022-08-09 11:23:16 +08:00 via Android
private 是内部实现,public 是接口。 类是给外部提供服务的, 外部需要怎样使用这个类,就暴露怎样的接口。responsibility-driven 。 不打算提供的接口就用 private 。protected 是给子类 override 的,template pattern 就是这样用的。 建议系统学习 oo 的思想, 参考书籍“冒号课堂“, “head dirst design pattern"
|
12
weeei 2022-12-02 17:35:40 +08:00
类方法非必要的全部 private ,类继承全部用 public 。至于 protected 暂时先别管。
|