324

C ++类中的成员private和成员有什么区别?protected

我从最佳实践约定中了解到,应该创建不在类外调用的变量和函数private——但是看看我的 MFC 项目,MFC 似乎更喜欢protected.

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

4

18 回答 18

423

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

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

编辑:它们的类的朋友也可以访问两者,如果是受保护的成员,它们的派生类的朋友也可以访问它们。

编辑 2:在您的问题的上下文中使用任何有意义的东西。您应该尽可能将成员设为私有,以减少耦合并保护基类的实现,但如果这不可能,则使用受保护的成员。检查C++ FAQ以更好地理解该问题。这个关于受保护变量的问题也可能有所帮助。

于 2008-10-22T09:14:25.520 回答
148

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

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

类 A 的私有成员不能在 A 的代码之外或从 A 派生的任何类的代码中访问。

所以,最终,在受保护或私有之间进行选择是在回答以下问题:您愿意对派生类的程序员给予多少信任?

默认情况下,假设派生类不可信,并使您的成员成为私有的。如果您有充分的理由让母类内部对其派生类的自由访问,那么您可以使它们受到保护。

于 2008-10-22T09:22:10.120 回答
76

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

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
};

就“最佳实践”而言,这取决于。如果甚至有微弱的可能性,有人可能想从您现有的类派生一个新类并需要访问内部成员,请将它们设为受保护的,而不是私有的。如果它们是私有的,您的类可能会变得难以轻松继承。

于 2008-10-22T09:18:56.150 回答
24

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

于 2008-10-22T09:19:01.297 回答
10

这完全取决于您想要做什么,以及您希望派生类能够看到什么。

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(); // will work, simply calls the derived version.
        protFunc(); // will work
        publFunc(); // will return 1 since it's overridden in this class
    }
}
于 2008-10-22T09:26:52.373 回答
6

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

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

于 2008-10-22T09:14:53.647 回答
6

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

于 2008-10-22T09:48:07.650 回答
4

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

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

于 2008-10-22T09:15:35.767 回答
4

私有成员只能从类内部访问,受保护成员可以在类和派生类中访问。这是 OO 语言中的继承特性。

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

于 2008-10-22T09:16:57.090 回答
3

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

protected = 母舰(基类)和她的女儿可以访问(即只有我的父母可以进入我父母的卧室,但允许儿子/女儿走进父母的卧室)

公共= 母舰(基层)、女儿和其他所有人都可以访问(即只有我的父母可以进入我父母的卧室,但这是一个家庭聚会 - mi casa su casa)

于 2017-04-01T16:02:20.743 回答
2

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

于 2013-02-22T07:40:28.413 回答
2

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

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

private根本无法访问。没有人可以在课堂外使用它们,也没有人可以滥用它们。甚至在派生类中也没有。

protected是一种折衷方案,因为它可以在派生类中使用。当您从一个类派生时,您对基类有很好的理解,并且小心不要误用这些成员。

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

诸如此类的成员SetWindowTextpublic因为您经常需要访问这些成员。

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

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

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

于 2018-06-15T06:12:53.283 回答
2

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

受保护:可由类成员函数、友元函数或友元类和派生类访问。

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

有关更多详细信息,请参阅此链接

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

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

于 2016-09-10T16:36:02.620 回答
0

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

于 2014-07-14T14:38:29.957 回答
0

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

  • 指向直接或间接派生类的指针
  • 对直接或间接派生类的引用
  • 直接或间接派生类的对象
于 2016-06-18T05:42:52.883 回答
0

关键字指定对成员列表中的类成员的protected访问,直到下一个访问说明符(publicprivate)或类定义的结尾。Class members声明为protected只能由以下人员使用:

  • 最初声明这些成员的类的成员函数。
  • 最初声明这些成员的类的朋友。
  • 从最初声明这些成员的类派生的具有公共或受保护访问权限的类。
  • 直接私有派生类,它们也对受保护成员具有私有访问权限。

在基类名称之前,protected关键字指定基类的公共成员和受保护成员是其派生类的受保护成员。

受保护的成员不像private成员那样私有,成员只能被声明它们的类的成员访问,但它们不像公共成员那样公开,公共成员可以在任何函数中访问。

也被声明为可被派生类的static任何成员函数访问的受保护成员。friend未声明为静态的受保护成员只能通过派生类的指针、引用或对象访问派生类中的朋友和成员函数。

受保护的 (C++)

于 2022-02-07T19:18:30.353 回答
-3

private 和 protected 访问修饰符是相同的,只是基类的受保护成员可以在子(派生)类的基类范围之外访问。它也同样适用于继承。但是使用 private 修饰符,基类的成员只能在基类的范围或代码及其友元函数中访问''''

于 2016-12-05T08:45:46.230 回答