C++面向对象编程

2022-08-08 10:23:00 +08:00
 LLPikaPika

C++面向对象编程,设计一个类的时候,Public Private Protected 怎么使用,分别用来修饰什么变量或方法?——来自 C++初学者

2724 次点击
所在节点    C++
12 条回复
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 同理,类似的。只不过添加了 子类 可以改变 父类 这个规则。
LLPikaPika
2022-08-08 11:47:21 +08:00
嗯嗯,收获满满
listenerri
2022-08-08 11:49:08 +08:00
如果不确定的话,可以先用 private ,等需要用到时,就发现原来这个需要是 protected / public ,不得不说这是一个稍稍笨 /慢一些的方法,但可以让人从实践中去理解锻炼或者说纠正思路。

先上手然后再慢慢理清楚 vs 先弄清楚然后再动手。(我偏好后者)
lanlanye
2022-08-08 14:02:52 +08:00
同意楼上,先全都 private ,需要的时候再去改
mingl0280
2022-08-08 14:19:20 +08:00
C++中,public private protected 是当你的类需要给别人用的时候,用来提供封装性,确保其他人不会误用的。
例如:一个类中,有二十个函数,其中五个是你想直接暴露给其他人的(public),剩下的十个是你自己用的(private),还有五个是你想让用这个类的人自己处理的(protected)。
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
hu8245
2022-08-08 17:24:19 +08:00
自己用,private ,可能给其他类用,public ,只给好朋友还有儿子用,protected
cwaken
2022-08-08 23:49:09 +08:00
google 代码规范里写的比较清楚
nightwitch
2022-08-09 01:24:55 +08:00
如果你不知道,那就用 public
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),不过前者能够搜得出的资料相对更好一些。
apake
2022-08-09 11:23:16 +08:00
private 是内部实现,public 是接口。 类是给外部提供服务的, 外部需要怎样使用这个类,就暴露怎样的接口。responsibility-driven 。 不打算提供的接口就用 private 。protected 是给子类 override 的,template pattern 就是这样用的。 建议系统学习 oo 的思想, 参考书籍“冒号课堂“, “head dirst design pattern"
weeei
2022-12-02 17:35:40 +08:00
类方法非必要的全部 private ,类继承全部用 public 。至于 protected 暂时先别管。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/871355

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX