C++数据成员

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的偏移量不同,所以这个操作必须延迟到执行期。

 

C++数据成员,布布扣,bubuko.com

C++数据成员

上一篇:微信小程序之swiper


下一篇:C++虚继承