有了private修饰符,为啥可以直接访问其他对象中的成员?

Posted

技术标签:

【中文标题】有了private修饰符,为啥可以直接访问其他对象中的成员?【英文标题】:With a private modifier, why can the member in other objects be accessed directly?有了private修饰符,为什么可以直接访问其他对象中的成员? 【发布时间】:2011-09-13 04:33:37 【问题描述】:

我有以下代码:

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

private 纯粹在课堂上工作。 protecteddoesn't @MSalters:当然可以。类的成员仍然可以访问该类类型的其他对象,包括访问基子对象(代码所在的类类型的其他对象)内的受保护成员的能力。 c++ 中的访问说明符控制对名称的访问,而不是对象。如果您能找到一种合法的方式来引用它们,那么实际上可以访问不同类的私有成员。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:
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.

【讨论】:

以上是关于有了private修饰符,为啥可以直接访问其他对象中的成员?的主要内容,如果未能解决你的问题,请参考以下文章

面向对象访问控制修饰符privat…(转载)

Java访问修饰符:publicprotected缺省private

php类点滴---访问修饰符public protected private

实例变量修饰符

iOS 实例变量修饰符

面向对象编程(OOP) 权限修饰符