C++中的private:类型相同的两个对象,是否可以访问对方的private成员?
2017-03-28 17:41
501 查看
下面的代码,为什么可以编译通过?
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++中,模块的实现主要就是类,而不是运行时的“对象”,因此,从这个角度来看,对象级别访问控制,没有什么实际意义。
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++中,模块的实现主要就是类,而不是运行时的“对象”,因此,从这个角度来看,对象级别访问控制,没有什么实际意义。
相关文章推荐
- 我的黑科技,让C++可以访问private成员
- 我的黑科技,让C++可以访问private成员
- C/C++—— 除了用类成员函数访问类私有成员变量外,还可以通过类对象地址来直接访问和修改类的私有成员变量
- 测试在类的内部是否可以访问对象的私有成员
- C++对象中的私有成员变量可以被访问
- 比较检查一个指定对象是否是特定的类型,或者两个对象的类型是否相同
- C#之转换两个不同类型但是成员相同的对象
- c++中,同个类的不同实例可以相互访问对方的私有、保护成员
- 待补遗(6)[C++]两个类如何通过友元声明互相访问对方的非公有成员
- C++本类可以访问本身类的私有成员(即拷贝构造函数可以访问本身对象的私有成员)
- C++中类的访问权限针对的是类而不是对象!(为什么类中的函数可以访问对象的私有成员?)
- 如何在编译时刻判断两个类型是否可以自动转换?——《Modern C++ Design》读书笔记(1)
- C++ 封装不是万能的 private 数据成员的值可以在类外被访问
- C++为什么类的成员函数中(复制构造函数,赋值操作符等)可以有貌似类的对象访问类的私有成员的用法?
- 同一个类不同对象,可以互相访问对方的私有成员而不通过get()或set()
- java 反射比较两个类型相同的对象 内部的变量是否相等
- 类成员函数可以访问相同类对象的私有对象
- C++派生类对象访问基类的protected成员
- C++返回类实例,以及访问其他对象的私有成员
- 比较两个string类型数组(String[ ])是否相同