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

23

我有以下代码:

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?

4个回答

30

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

如果你了解保护的作用是确保封装以确保类的编写者可以构建一个连贯的类,并且不必保护外部代码修改对象内容,那么这就说得通了。

另一个想法是真正的“为什么?”。考虑几乎任何拷贝构造函数的编写方式;你想要访问原始的底层数据结构,而不是其呈现的接口。


private 仅在类级别起作用。 protected 则不同,它可以被派生类访问。 - MSalters
@MSalters:当然有。类的成员仍然可以增强访问该类类型的其他对象,包括能够访问基础子对象中的受保护成员(代码所在的该类类型的其他对象)。 - Ben Voigt
C++中的访问控制符调节对名称的访问而非对象。如果你可以找到合法的方法引用它们,其实是可以访问不同类的私有成员的。 - bames53

4

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

在这种情况下,它是构造函数和其他实例(即a1、a2)。


0
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.

0
简短回答:在A类的成员方法中,可以访问对象/指针和静态成员的所有成员。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接