您的位置:首页 > 编程语言 > C语言/C++

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

2017-03-28 17:41 501 查看
下面的代码,为什么可以编译通过?

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++中,模块的实现主要就是类,而不是运行时的“对象”,因此,从这个角度来看,对象级别访问控制,没有什么实际意义。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐