class Foo
{
public:
void someFunk( Foo &bar );
private:
int a;
...
};
void Foo::someFunk( Foo &bar )
{
a = bar.a;
}
我注意到允许作为参数传递的对象访问私有数据成员。我可以看到为什么这个指针,但不应该作为参数传递的对象必须调用一个访问器?我认为这是错误的,但代码正在为我编译。
答案 0 :(得分:5)
我不知道官方的理由是什么,但在我看来,能够访问自己类的另一个对象的私有成员不会破坏封装,也不会产生任何额外的耦合。
封装的要点是A类的对象不应该知道B类对象的内部工作原理,因此B的实现可以在不影响A的情况下改变。但是A类的任何对象都知道内部的内部关于A类的任何其他对象,换句话说,讨论两个不同类之间的耦合是有意义的,但谈论同一类的两个对象之间的耦合是没有意义的。
在更实际的层面上,如果您无法访问同一类对象的私有成员,您将如何实现复制构造函数?您必须拥有每个私人会员的访问者,这距离公开只有一步之遥。更不用说为每个私人会员提供一个吸气剂会使你的课程变得不必要的大而且难以维持。
答案 1 :(得分:3)
private
的定义意味着它对类是私有的,而不是对象。该类的任何对象都可以访问另一个类对象的成员。例如,这对于实现复制构造函数至关重要。
答案 2 :(得分:1)
这取决于语言 - 在C#(和它出现的C ++)中,成员是类而不是实例的私有。在其他语言(如Ruby)中,成员只能访问实例。