class Foo
{
public:
void someFunk(Foo &bar);
private:
int a;
...
};
void Foo::someFunk(Foo &bar)
{
a = bar.a;
}
我注意到作为参数传递的对象被允许访问私有数据成员。我可以看到为什么这个指针,但不应该作为参数传递的对象必须调用访问器?我认为这是错误的,但代码正在为我编译。类对象作为参数传递,访问他们自己的私有成员
class Foo
{
public:
void someFunk(Foo &bar);
private:
int a;
...
};
void Foo::someFunk(Foo &bar)
{
a = bar.a;
}
我注意到作为参数传递的对象被允许访问私有数据成员。我可以看到为什么这个指针,但不应该作为参数传递的对象必须调用访问器?我认为这是错误的,但代码正在为我编译。类对象作为参数传递,访问他们自己的私有成员
我不知道官方的理由是什么,但在我看来,能够访问您自己班级的另一个对象的私有成员不会破坏封装,也不会产生任何额外的耦合。
封装的一点是,类A的对象不应该知道类B的对象的内部工作,以便B的实现可以改变而不影响A.但是,根据定义,类A的任何对象都知道换句话说,谈论两个不同类别之间的耦合是有意义的,但谈论同一类别的两个对象之间的耦合是没有意义的。
在更实用的层面上,如果您无法访问同一类的对象的私有成员,那么您将如何实现复制构造函数?你必须为每个私人成员设置一个访问者,这个访问者距离公开只有一步之遥。更不用说为每个私人成员提供一个getter会使你的班级变得不必要的庞大而难以维护。
它取决于语言 - 在C#中(和C++看起来)成员对于类而不是实例是私有的。在Ruby等其他语言中,只有实例才能访问成员。
看起来像是堆栈溢出问题,而不是程序员Stackexchange。 – Carson63000 2011-04-09 09:22:56