V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LLPikaPika
V2EX  ›  C++

C++面向对象编程

  •  1
     
  •   LLPikaPika · 2022-08-08 10:23:00 +08:00 · 2888 次点击
    这是一个创建于 840 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    先上手然后再慢慢理清楚 vs 先弄清楚然后再动手。(我偏好后者)
    lanlanye
        4
    lanlanye  
       2022-08-08 14:02:52 +08:00
    同意楼上,先全都 private ,需要的时候再去改
    mingl0280
        5
    mingl0280  
       2022-08-08 14:19:20 +08:00 via Android
    C++中,public private protected 是当你的类需要给别人用的时候,用来提供封装性,确保其他人不会误用的。
    例如:一个类中,有二十个函数,其中五个是你想直接暴露给其他人的(public),剩下的十个是你自己用的(private),还有五个是你想让用这个类的人自己处理的(protected)。
    mirrorman
        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
    hu8245
        7
    hu8245  
       2022-08-08 17:24:19 +08:00
    自己用,private ,可能给其他类用,public ,只给好朋友还有儿子用,protected
    cwaken
        8
    cwaken  
       2022-08-08 23:49:09 +08:00 via iPhone
    google 代码规范里写的比较清楚
    nightwitch
        9
    nightwitch  
       2022-08-09 01:24:55 +08:00
    如果你不知道,那就用 public
    cnbatch
        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),不过前者能够搜得出的资料相对更好一些。
    apake
        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"
    weeei
        12
    weeei  
       2022-12-02 17:35:40 +08:00
    类方法非必要的全部 private ,类继承全部用 public 。至于 protected 暂时先别管。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5567 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 07:52 · PVG 15:52 · LAX 23:52 · JFK 02:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.