私有和受保护的成员:C ++
有人能教我关于私人和被保护的成员在课堂上的区别吗? 我从最佳做法惯例了解到,那些在课堂外没有被调用的variables和函数应该是私有的,但是看着我的MFC项目,MFC似乎更喜欢保护。
有什么区别,我应该使用什么?
私人成员只能在定义它们的类中访问。
受保护的成员可以在定义它们的类中以及从该类inheritance的类中访问。
编辑:两者都可以由他们的class级的朋友,在受保护的成员的情况下,由他们的派生类的朋友访问。
编辑2:使用任何有意义的问题上下文。 你应该尽可能地使成员成为私有的,以减less耦合并保护基类的实现,但是如果这是不可能的,那么使用受保护的成员。 检查C ++常见问题 ,以更好地了解问题。 这个关于保护variables的问题也可能有帮助。
A类的公共成员可供所有人和所有人使用。
A类受保护的成员不能在A的代码之外访问,但可以从A派生的任何类的代码访问。
A类的私人成员不能在A的代码之外访问,也不能从A中得到的任何类的代码中访问。
所以,最后,在保护还是私人之间进行select,正在回答以下问题: 您愿意将多less信任放到派生类的程序员中?
默认情况下 ,假定派生类不被信任, 并使您的成员保密 。 如果你有一个很好的理由让母类的内部机构免费访问它的派生类,那么你可以保护它们。
受保护的成员可以从派生类访问。 私人不能。
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 };
就“最佳实践”而言,这取决于。 如果有人可能想从现有的课程中派生一个新class级,并且需要访问内部成员,那么他们可能会受到保护,而不是私人的。 如果他们是私人的,你的class级可能很难轻易inheritance。
MFC赞成保护的原因是因为它是一个框架。 您可能想要inheritanceMFC类,在这种情况下,需要一个受保护的接口来访问一般使用该类的方法。
这一切都取决于你想要做什么,以及你想要派生类能够看到什么。
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 } }
被标记为protected
属性和方法 – 与私有属性不同 – 在子类中仍然可见。
除非你不想使用或提供覆盖可能的子类中的方法的可能性,否则我会让它们变成private
。
受保护的成员只能由类的后代访问,并且可以通过同一模块中的代码访问。 私人成员只能通过声明的类来访问,并且可以通过同一模块中的代码来访问。
当然,朋友的function把这个东西扔出去了,不过哦。
私人成员只能从类中访问,受保护的成员可以在类和派生类中访问。 这是OO语言中inheritance的特征。
您可以在C ++中拥有私有的,受保护的和公共的inheritance,这将决定哪些派生类可以在inheritance层次结构中访问。 例如C#只有公有inheritance。
当然要看看受保护的成员variables问题。 build议使用private作为默认值(就像C ++ class
一样)来减less耦合。 受保护的成员variables通常是一个坏主意,受保护的成员函数可以用于例如模板方法模式。
因为不需要公共成员函数来获取和更新派生类中的受保护成员,这就增加了代码的效率,并减less了我们需要编写的代码量。 但是派生类的程序员应该知道他在做什么。
私人 =只能由母亲(基本类)访问(即只有我的父母可以进入我父母的卧室)
受保护的 =可以通过母亲(基础class)和她的女儿(即只有我的父母可以进入我父母的卧室,但允许儿子/女儿走进父母的卧室)
公众 =母亲(基础class),女儿和其他人(即只有我的父母可以进入我父母的卧室,但这是一个家庭聚会 – 米卡萨苏卡萨)
私有成员只能在它声明的同一类中被访问,因为被保护的成员可以在被声明的类中被访问,并且被类inheritance。
私有:它是一个访问说明符。 默认情况下,实例(成员)variables或c ++ / java中的类的方法是私有的。 在inheritance期间,代码和数据总是被inheritance,但不能在类之外访问。 我们可以声明我们的数据成员是私有的,这样任何人都不能直接修改我们的成员variables,我们可以提供公共的getter和setter来改变我们的私有成员。 这个概念总是应用在商业规则中。
受保护:它也是一个访问说明符。 在c ++中,受保护的成员可以在类中访问,也可以在inheritance类中访问,但不在类之外。 在java中,受保护的成员可以在类中访问,也可以在inheritance类中访问,也可以在同一个包中访问所有类。
私有和受保护的访问修饰符只有一个,并且只有基类的受保护成员可以在子类(派生)的基类范围之外访问。 它也适用于inheritance。 但是对于私有修饰符,基类的成员只能在基类的范围或代码中访问,而其友元函数只能访问“'”
受保护的非静态基类成员可以通过使用以下之一从该基类派生的任何类的成员和朋友访问:
- 指向直接或间接派生类的指针
- 对直接或间接派生类的引用
- 直接或间接派生类的一个对象