2011-04-09 74 views
3
class Foo 
{ 
public: 
void someFunk(Foo &bar); 
private: 
int a; 
... 
}; 

void Foo::someFunk(Foo &bar) 
{ 
a = bar.a; 
} 

我注意到作为参数传递的对象被允许访问私有数据成员。我可以看到为什么这个指针,但不应该作为参数传递的对象必须调用访问器?我认为这是错误的,但代码正在为我编译。类对象作为参数传递,访问他们自己的私有成员

+5

看起来像是堆栈溢出问题,而不是程序员Stackexchange。 – Carson63000 2011-04-09 09:22:56

回答

5

我不知道官方的理由是什么,但在我看来,能够访问您自己班级的另一个对象的私有成员不会破坏封装,也不会产生任何额外的耦合。

封装的一点是,类A的对象不应该知道类B的对象的内部工作,以便B的实现可以改变而不影响A.但是,根据定义,类A的任何对象都知道换句话说,谈论两个不同类别之间的耦合是有意义的,但谈论同一类别的两个对象之间的耦合是没有意义的。

在更实用的层面上,如果您无法访问同一类的对象的私有成员,那么您将如何实现复制构造函数?你必须为每个私人成员设置一个访问者,这个访问者距离公开只有一步之遥。更不用说为每个私人成员提供一个getter会使你的班级变得不必要的庞大而难以维护。

1

它取决于语言 - 在C#中(和C++看起来)成员对于类而不是实例是私有的。在Ruby等其他语言中,只有实例才能访问成员。

3

private的定义表示它对类是私有的,而不是对象。该类的任何对象都可以访问另一个类对象的成员。例如,这对于实现拷贝构造函数是非常重要的。

+0

那么,你总是可以写/使用访问器,但这将是一个麻烦。 – Xeo 2011-04-09 15:32:26

+0

@Xeo,不仅如此,它还会打破访问保护的目的。基本上,所有的数据成员都是公共可读的。 – Dima 2011-04-09 15:42:18

+1

@Dima:哈,真够的。人们需要区分实例私有和类私有......多么麻烦。 :P – Xeo 2011-04-09 15:43:51