Static成员
class B { public : static int val; }; int B::val=0; class D :public B { }; int _tmain(int argc, _TCHAR* argv[]) { B::val=5; cout <<D::val<<endl;//5 }
说明:static成员变量在继承体系中只有一份,其访问方式限制(public,private)和普通成员变量相同,但注意使用类名访问时应该B::val而不是B.val(与C#不同)。
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的偏移量不同,所以这个操作必须延迟到执行期。