私人和受保护成员:C ++

时间:2008-10-22 09:11:22

标签: c++ class mfc

有人可以告诉我类中privateprotected成员之间的区别吗?

我从最佳实践约定中了解到,不应在类外部调用的变量和函数private - 但要查看我的 MFC 项目, MFC 似乎赞成protected

有什么区别,我应该使用哪种?

16 个答案:

答案 0 :(得分:336)

私人成员只能在定义它们的类中访问。

受保护的成员可以在定义它们的类中以及从该类继承的类中访问。

编辑:他们的班级的朋友也可以访问这两个人,对于受保护的成员,他们的派生类的朋友也可以访问。

编辑2:在问题的上下文中使用任何有意义的内容。您应该尝试在可以减少耦合并保护基类的实现时使成员变为私有,但如果不可能,则使用受保护的成员。请查看C++ FAQ以更好地了解该问题。 This question about protected variables也可能会有所帮助。

答案 1 :(得分:124)

所有人都可以访问A类的公共成员。

受保护的 A类成员不能在A代码之外访问,但可以从A派生的任何类的代码访问。

A类的私有成员无法在A代码之外访问,也无法从A派生的任何类的代码访问。

所以,最后,在protected或private之间进行选择会回答以下问题:您愿意对派生类的程序员投入多少信任?

默认情况下,假设不会信任派生类,使您的成员成为私有。如果你有充分的理由可以免费访问母类'内部的派生类,那么你可以使它们受到保护。

答案 2 :(得分:57)

可以从派生类访问受保护的成员。私人不能。

class Base {

private: 
  int MyPrivateInt;
protected: 
  int MyProtectedInt;
public:
  int MyPublicInt;
};

class Derived : Base
{
public:
  int foo1()  { return MyPrivateInt;} // Won't compile!
  int foo2()  { return MyProtectedInt;} // OK  
  int foo3()  { return MyPublicInt;} // OK
};‌‌

class Unrelated 
{
private:
  Base B;
public:
  int foo1()  { return B.MyPrivateInt;} // Won't compile!
  int foo2()  { return B.MyProtectedInt;} // Won't compile
  int foo3()  { return B.MyPublicInt;} // OK
};

就“最佳实践”而言,取决于。如果有人甚至可能想要从现有的类中获取新类并且需要访问内部成员,那么请将它们设为Protected,而不是Private。如果他们是私人的,你的班级可能很难轻易继承。

答案 3 :(得分:21)

MFC偏爱受保护的原因是因为它是一个框架。您可能希望子类化MFC类,在这种情况下,需要一个受保护的接口来访问一般使用该类不可见的方法。

答案 4 :(得分:8)

这一切都取决于你想做什么,以及你希望派生类能够看到什么。

class A
{
private:
    int _privInt = 0;
    int privFunc(){return 0;}
    virtual int privVirtFunc(){return 0;}
protected:
    int _protInt = 0;
    int protFunc(){return 0;}
public:
    int _publInt = 0;
    int publFunc()
    {
         return privVirtFunc();
    }
};

class B : public A
{
private:
    virtual int privVirtFunc(){return 1;}
public:
    void func()
    {
        _privInt = 1; // wont work
        _protInt = 1; // will work
        _publInt = 1; // will work
        privFunc(); // wont work
        privVirtFunc(); // wont work
        protFunc(); // will work
        publFunc(); // will return 1 since it's overridden in this class
    }
}

答案 5 :(得分:5)

标记为protected的属性和方法 - 与私有属性不同 - 在子类中仍然可见。

除非您不想使用或提供覆盖可能子类中的方法的可能性,否则我会将它们private

答案 6 :(得分:4)

受保护的成员只能由类的后代和同一模块中的代码访问。私有成员只能通过声明它们的类以及同一模块中的代码来访问。

当然朋友的功能会把它扔出窗外,但是哦。好吧。

答案 7 :(得分:4)

私有成员只能从类中访问,受保护的成员可以在类和派生类中访问。它是OO语言中继承的一个特征。

您可以在C ++中拥有私有,受保护和公共继承,这将确定哪些派生类可以在继承层次结构中访问。例如,C#只有公共继承。

答案 8 :(得分:4)

当然看看Protected Member Variables问题。建议使用private作为默认值(就像C ++ class ses一样)来减少耦合。受保护的成员变量总是一个坏主意,受保护的成员函数可用于例如受保护的成员函数。模板方法模式。

答案 9 :(得分:3)

私人 =仅由母舰(基类)访问 (即只有我的父母可以进入我父母的卧室)

受保护 =可由母舰(基地)及其女儿进入 (也就是说,只有我的父母可以进入我父母的卧室,但允许儿子/女儿进入父母的卧室)

公众 =可由母舰(基地),女儿和其他所有人访问 (也就是说,只有我的父母可以进入我父母的卧室,但这是一个家庭聚会 - mi casa su casa)

答案 10 :(得分:2)

由于在派生类中不需要公共成员函数来获取和更新受保护的成员,因此可以提高代码的效率并减少我们需要编写的代码量。但是,派生类的程序员应该知道他在做什么。

答案 11 :(得分:1)

私有成员只能在已声明的同一个类中访问,其中可以在类中声明受保护成员,以及它所继承的类。

答案 12 :(得分:1)

  • 私有:它是一个访问说明符。默认情况下,实例(成员)变量或c ++ / java中类的方法是私有的。在继承期间,代码和数据始终是继承的,但在类之外是不可访问的。我们可以将我们的数据成员声明为私有,这样任何人都无法直接更改我们的成员变量,我们可以提供公共getter和setter来更改我们的私有成员。这个概念总是应用于业务规则中。

  • 受保护:它也是一个访问说明符。在C ++中,受保护的成员可以在类和继承的类中访问,但不能在类外部访问。在Java中,受保护的成员可以在类中访问,也可以在继承的类中访问,也可以在同一个包中的所有类中访问。

答案 13 :(得分:1)

private是会员数据的首选。默认情况下,C ++类中的成员为private

public是成员函数的首选,但这是一个意见问题。至少有一些方法必须是可访问的。所有人都可以访问public。这是最灵活的选择,也是最不安全的选择。任何人都可以使用它们,任何人都可以滥用它们。

根本无法访问

private。没有人可以在课外使用它们,没有人可以滥用它们。甚至不在派生类中。

protected是一种妥协,因为它可以在派生类中使用。当你从一个类派生时,你对基类有了很好的理解,并且你小心不要滥用这些成员。

MFC是Windows API的C ++包装器,它更喜欢publicprotected。 Visual Studio向导生成的类具有protectedpublicprivate成员的混乱。但是MFC类本身有一些逻辑。

SetWindowText之类的成员是public,因为您经常需要访问这些成员。

OnLButtonDown等成员处理窗口收到的通知。不应该访问它们,因此它们是protected。您仍然可以在派生类中访问它们以覆盖这些函数。

有些成员必须执行线程和消息循环,不应该访问它们或覆盖它们,因此它们被声明为private

在C ++结构中,默认情况下成员为public。结构通常仅用于数据,而不用于方法,因此public声明被认为是安全的。

答案 14 :(得分:0)

使用以下其中一项,可以由从该基类派生的任何类的成员和朋友访问受保护的非静态基类成员:

  • 指向直接或间接派生类的指针
  • 对直接或间接派生类的引用
  • 直接或间接派生类的对象

答案 15 :(得分:0)

私有:可由类成员函数和朋友函数或朋友类访问。 对于C ++类,这是默认的访问说明符。

受保护的:可由类成员函数,朋友函数或朋友类及派生类访问。

  • 您可以根据需要将类成员变量或函数(甚至是typedef或内部类)保留为私有或受保护。
  • 大多数时候,您将类成员保留为私有,并添加get / set函数进行封装。这有助于维护代码。
  • 通常,当您要保持公共功能模块化或消除重复的代码而不是将整个代码写入单个功能时,通常使用私有功能。这有助于维护代码。

Refer this link了解详情。