假设我们有一个带有单个private
变量的类和一个max
方法,该方法采用与该类相同类型的单个参数:
class A
{
private:
int Number;
public:
A() : Number(0) {}
A(int val) : Number(val) {}
int max(A b)
{
if( Number > b.Number )
return Number;
return b.Number;
}
};
令我感到奇怪的是,max方法中的参数b
可以访问private
变量Number
。但是,在main
函数中,我们无权访问参数Number
(因为被声明为private
,这是预期的)
int main()
{
A a;
a.Number = 0; // ERROR
return 0;
}
所以我的问题是,为什么类中的函数在声明为Number
时才能访问变量private
。
答案 0 :(得分:4)
仅此而已。
它的设计使成员函数(尤其是赋值运算符,复制构造函数和重载运算符)更易于编写。如果您无法直接访问“其他”对象的成员,那么您将需要大量的friend
声明或丑陋的“获取器”;后者往往只提供绕过封装的功能。
也许您建议的方式可能是默认方式,而引入私有和受保护的成员和函数可能需要声明
friend class;
但是C ++并不是以这种方式设计的,该建议现在将是一个可怕的突破性变化。虽然可以恢复您的预期行为,但值得思考的是
friend class = delete;
据我所知,不是是一个重大变化。为什么不向ISO C ++委员会提出这种形式的建议呢?
答案 1 :(得分:3)
封装背后的原理是从外部类中隐藏类的内部。
当您认为所编写的函数在类A
的内部时,对于函数而言,了解A
的内部是有意义的-无论上下文如何。