C++类的私有成员和受保护成员之间的区别是什么
What is the difference between private and protected members of C++ classes?
C++类中的private
和protected
成员之间有什么区别?
我从最佳实践惯例中了解到,没有在类外调用的变量和函数应该设置为private
——但从我的MFC项目来看,MFC似乎更喜欢protected
。
有什么区别,我应该使用哪一个?
私有成员只能在定义它们的类中访问。
受保护成员可以在定义它们的类中以及从该类继承的类中访问。
编辑:它们的类的朋友也可以访问,如果是受保护的成员,则由其派生类的朋友访问。
编辑2:在你的问题中使用任何有意义的东西。您应该尽可能地将成员设为私有成员,以减少耦合并保护基类的实现,但如果这不可能,则使用受保护的成员。查看C++常见问题解答以更好地了解该问题。这个关于受保护变量的问题可能也会有所帮助。
a类的公共成员对所有人都是可访问的。
a类的受保护成员不能在a的代码之外访问,但可以从从a派生的任何类的代码中访问。
私有类a的成员在a的代码之外或从a派生的任何类的代码中都不可访问。
因此,最终,在受保护还是私有之间做出选择是在回答以下问题:您愿意对派生类的程序员给予多大的信任
默认情况下,假设派生类不受信任,并且将您的成员设为私有。如果您有充分的理由允许免费访问派生类的母类内部,那么您可以使它们受到保护。
受保护的成员可以从派生类访问。私人不能。
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
};
就"最佳实践"而言,这取决于情况。如果有人想从你现有的类中派生一个新类,并且需要访问内部成员,那么就让他们成为受保护的,而不是私有的。如果它们是私有的,那么您的类可能很难轻易继承。
MFC喜欢受保护的原因是因为它是一个框架。您可能想要对MFC类进行子类化,在这种情况下,需要一个受保护的接口来访问对该类的一般用途不可见的方法。
这一切都取决于您想要做什么,以及您希望派生类能够看到什么。
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
}
}
与私有属性和方法不同,标记为protected
的属性和方法在子类中仍然可见。
除非您不想在可能的子类中使用或提供重写该方法的可能性,否则我会将它们设为private
。
请务必查看受保护成员变量问题。建议使用private作为默认值(就像C++class
ses所做的那样)以减少耦合。受保护的成员变量总是一个坏主意,受保护的会员函数可以用于例如模板方法模式。
受保护的成员只能由类的后代和同一模块中的代码访问。私有成员只能由声明它们的类和同一模块中的代码访问。
当然,朋友函数会把这个抛到九霄云外,但哦,好吧。
私有成员只能从类内访问,受保护成员可以在类和派生类中访问。这是OO语言中继承的一个特性。
您可以在C++中拥有私有、受保护和公共继承,这将决定哪些派生类可以在继承层次结构中访问。例如,C#只有公共继承。
专用=只能由母舰(基类)访问(只有我父母才能进我父母的卧室)
protected=可供母舰(基础级)及其女儿使用(即只有我的父母才能进入我父母的卧室,但允许儿子/女儿进入父母的卧室)
公共=母舰(基本舱)、女儿和其他所有人都可以访问(即只有我父母才能进入我父母的卧室,但这是一个家庭聚会-mi casa su casa)
由于不需要公共成员函数来获取和更新派生类中受保护的成员,这提高了代码的效率,减少了我们需要编写的代码量。然而,派生类的程序员应该知道自己在做什么。
private
是成员数据的首选。C++类中的成员默认为private
。
public
是成员功能的首选,尽管这是一个意见问题。至少有一些方法必须是可访问的。CCD_ 11对所有人都是可访问的。这是最灵活、最不安全的选择。任何人都可以使用它们,任何人都可能滥用它们。
private
根本不可访问。没有人可以在课堂外使用它们,也没有人可以滥用它们。甚至在派生类中也没有。
protected
是一个折衷方案,因为它可以在派生类中使用。当您从一个类派生时,您对基类有很好的理解,并且注意不要滥用这些成员。
MFC是Windows API的C++包装器,它更喜欢public
和protected
。VisualStudio向导生成的类有protected
、public
和private
成员的丑陋混合。但是MFC类本身也有一些逻辑。
像SetWindowText
这样的成员是public
,因为您经常需要访问这些成员。
OnLButtonDown
等成员处理窗口接收到的通知。它们不应该被访问,因此它们是protected
。您仍然可以在派生类中访问它们来覆盖这些函数。
一些成员必须执行线程和消息循环,它们不应被访问或重写,因此它们被声明为private
在C++结构中,默认情况下,成员为public
。结构通常只用于数据,而不用于方法,因此public
声明被认为是安全的。
私有:可由类成员函数访问&朋友函数或朋友类。对于C++类,这是默认的访问说明符。
受保护:可由类成员函数、朋友函数或朋友类访问&派生类。
- 您可以根据需要将类成员变量或函数(甚至typedefs或内部类)保留为私有或受保护
- 大多数时候,您将类成员保留为私有成员,并添加get/set函数进行封装。这有助于维护代码
- 通常,当您希望保持公共函数模块化或消除重复代码,而不是将整个代码写入单个函数时,会使用私有函数。这有助于维护代码
有关更多详细信息,请参阅此链接。
-
私有:它是一个访问说明符。默认情况下,c++/java中类的实例(成员)变量或方法是私有的。在继承过程中,代码和数据总是被继承的,但不能在类之外访问。我们可以将我们的数据成员声明为私有成员,这样就没有人可以直接更改我们的成员变量,我们还可以提供公共getter和setter来更改我们的私有成员。这个概念总是应用在业务规则中。
-
受保护:它也是一个访问说明符。在C++中,受保护的成员可以在类内和继承的类中访问,但不能在类外访问。在Java中,受保护的成员在类内、继承的类以及同一包中的所有类都可以访问。
私有成员只能在其已声明的同一类中访问,在该类中,作为受保护成员可以在其与继承的类一起声明的类中访问。
受保护的非静态基类成员可以由从该基类派生的任何类的成员和朋友使用以下方法之一访问:
- 指向直接或间接派生类的指针
- 对直接或间接派生类的引用
- 直接或间接派生类的对象
protected
关键字指定对成员列表,直到下一个访问说明符(public
或private
)或类定义的末尾。声明为protected
的Class members
可以只能由以下人员使用:
- 最初声明这些成员的类的成员函数
- 最初宣布这些成员的班级之友
- 从最初声明这些成员的类派生出具有公共或受保护访问权限的类
- 直接私有派生类,这些类也可以对受保护成员进行私有访问
在基类名称前面时,
protected
关键字指定基类的公共成员和受保护成员其派生类的受保护成员。受保护的成员不像
private
成员那样私有,后者是只能由声明它们的类的成员访问,但他们不像公众成员那样公开,公众成员可以在任何函数。也声明为
static
的受保护成员可访问任何CCD_ 34或派生类的成员函数。受保护的成员未声明为静态的可由朋友和成员访问仅通过指向、引用或引用派生类中的函数,或派生类的对象。
受保护的(C++)
C++类中私有成员和受保护成员之间的区别是什么?
其他答案已经说明:
- 公共-所有人都可以访问
- protected-可由派生类(和朋友)访问
- 私人-受限
有什么区别,我应该使用哪一个?
C++核心指南给出的建议是,数据应该始终是私有的。我认为这是一个很好的建议,因为当你有可以访问受保护数据的派生类时,它会成为"数据意大利面条"。保护函数更有意义,但这取决于用例。
对于函数,您可以选择。对于数据,应将其设为私有数据,并在需要时提供受保护的访问器功能。这提供了对类数据的更多控制。
私有和受保护的访问修饰符是唯一的,只有在子(派生)类的基类范围之外,才能访问基类的受保护成员。它同样适用于继承。但是使用private修饰符,基类的成员只能在基类的作用域或代码中访问,其友元函数只能"
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 在VS2017中,我们如何在项目成员之间共享编译设置
- 常量成员和没有setter的私有成员之间有什么区别
- 成员变量的不同"kinds"之间的区别
- 基类和派生类中的模板成员之间的重载解析
- C++中类数据成员之间的通信
- 静态和非静态递归成员之间的差异
- 确保结构成员之间没有填充,以便将结构用作数组
- C++在同一对象的成员之间传递 ifstream 变量
- 将函数定义为静态成员和自由成员之间有什么区别
- 在成员之间共享对象
- 命名空间内的 extern const 和静态 const 类成员之间的区别
- 如何使用模板表达成员之间的约束
- Qt类及其成员之间的循环关系
- c++如何实现类成员之间的切换
- c++根据结构大小或其成员之间的最大对齐要求进行对齐
- 如何/应该在Qt中创建ui表单和数据成员之间的自动链接
- C++类的私有成员和受保护成员之间的区别是什么