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

时间:2011-09-13 04:33:38

标签: 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;
    }
};

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

4 个答案:

答案 0 :(得分:25)

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

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

另一种想法是真实的“为什么?”。考虑如何编写几乎任何复制构造函数;您希望访问原始的底层数据结构,而不是其显示的界面。

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

简短回答:在class A的成员方法中,可以访问(对象/指针和static成员)class A的所有成员。

答案 3 :(得分: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.