C++中的private:类型相同的两个对象,是否可以访问对方的private成员?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BigLeo/article/details/67639648

下面的代码,为什么可以编译通过?

class Point{
public:
   Point(Point & p);
private:
    int x;
}
Point::Point(Point & p){
   x = p.x;
}

Point::Point(Point & p)函数体中的语句“x = p.x”,为什么可以正常编译?

一、先看来自ISO/IEC 14882(C++ 98年标准),中的一段话
A member of a class can be
— private; that is, its name can be used only by members and friends of the class in which it is declared.
— protected; that is, its name can be used only by members and friends of the class in which it is declared, and by members and friends of classes derived from this class (see 11.5).
— public; that is, its name can be used anywhere without access restriction.

由此段文字可知,类的访问控制是针对类,而不是针对对象的。

二、可以从以下角度解释
1. 从实现的角度看:
在静态编译期,编译器无法判断指针(或引用)是否指向(或引用)了“自己(this)”。
例:void foo(Base & b)
编译器怎么能知道&b是否是this呢?

如果仅仅从字面上要求私有成员必须要以this访问,就太过严苛了。

2.从封装的角度看:
对于访问控制而言,我们关心的是模块信息隐藏,这是一个代码级静态概念,它保证了模块实现的改变不会影响到其它模块。C++中,模块的实现主要就是类,而不是运行时的“对象”,因此,从这个角度来看,对象级别访问控制,没有什么实际意义。

没有更多推荐了,返回首页