C++数据成员

来源:互联网 发布:淘宝手机收藏地址转换 编辑:程序博客网 时间:2024/05/17 07:14

说明:static成员变量在继承体系中只有一份,其访问方式限制(public,private)和普通成员变量相同,但注意使用类名访问时应该B::val而不是B.val(与C#不同)。转载请尊重原创、保留相关链接本文来自多宝平台http://www.mbodb.com

Data member 的存取

1. static data member

(1) 每一个static member的存取,并不会造成任何空间或执行时间上的负担。

另外 如果有Point org,*p=&org;

则org.x=0与p->x=0执行开销完全相同,这也是唯一一种情况因为static member并不在对象中,这只是个语法上的便宜行事而已。

(2)即使这个static member是经过虚拟或间接继承而来的,依然不影响他的存取效率。因为他是程序中的唯一实体。

(3)两个类有同名的static member并不会造成名字冲突,多宝因为属于不同的Class,会被C++名字修饰机制修饰成不同名字。

(4)另外,如果取一个static member的地址会得到一个指向其数据类型的指针(如 int*),而不是一个指向其class member的指针。因为static member并不在一个class object之中。

2. Nonstatic Data Member

(1) 欲对一个nanstatic data member进行存取,编译器需要使用对象的地址加上data member的偏移量(offset)。(data member的偏移量可在编译期获得)

(2) 对于org.x=0与p->x=0的存取效率,当x是一个直接类成员,或者在单一继承、多继承中(多继承中offset也是在编译期计算好的),两者效率完全相同,但是如果x是虚基类的成员,则后者的存取效率会慢一些。因为编译器不能确定p指向的基类还是派生类,而指向不同的类,虚基类的位置是不同的,也就导致data member的偏移量不同,所以这个操作必须延迟到执行期。

0 0