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

With a private modifier, why can the member in other objects be accessed directly?

本文关键字:访问 其他 对象 成员 为什么      更新时间:2023-10-16

我有以下代码:

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;
    }
};

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

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

如果你认为保护的作用是允许封装,以确保类的作者可以构建一个内聚的类,而不必防止外部代码修改对象内容,那么这是有意义的。

关于真正的"为什么?"的另一个想法。考虑一下如何编写几乎所有的复制构造函数;您希望访问原始的底层数据结构,而不是它所呈现的接口。

类的任何成员函数以及构造函数都可以访问私有数据。即调用该方法的实例对象的私有成员或其他实例的私有成员。

在本例中,它是构造函数和它的其他实例(即a1, a2)。

简答: class A的成员方法中(对象/指针和static成员)class A的所有成员都可以被访问

A(A a1, A a2)
{
    a1.x = 10;
    a2.x = 20;
}

现在从我的理解来看,你的问题是调用构造函数调用的对象如何能够访问其他类成员变量?

现在,构造函数和参数a1,a2都是类作用域。它可以访问它的所有成员,而不管它的访问级别。这也可以在构造函数中使用-

this->x = a1.x; // Notice that "this" members can be accessed too.
                // How ever both the member variables are different and are part of
                // different objects.