使用私有修饰符,为什么可以直接访问其他对象中的成员?

ipk*_*iss 22 c++ private-members

我有以下代码:

class A 
{
private:
    int x;
public:
    A()
    {
        x = 90;
    }
    A(A a1, A a2)
    {
        a1.x = 10;
        a2.x = 20;
    }
    int getX()
    {
        return this->x;
    }
};
Run Code Online (Sandbox Code Playgroud)

我知道代码可能很奇怪,但我不明白为什么a1并且a2可以访问私有数据成员x

Kei*_*ith 25

好问题.关键是C++中的保护是类级别,而不是对象级别.因此,在一个对象上调用的方法可以访问同一个类的任何其他实例的私有成员.

如果你看到保护的作用是允许封装以确保类的编写者可以构建一个内聚类,而不必保护外部代码修改对象内容,那么这是有道理的.

另一个想法是真正的"为什么?".考虑如何编写几乎任何复制构造函数; 您希望访问原始的底层数据结构,而不是其呈现的界面.