Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3593693
  • 博文数量: 207
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 7365
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-23 18:56
个人简介

将晦涩难懂的技术讲的通俗易懂

文章分类

全部博文(207)

文章存档

2024年(10)

2023年(9)

2022年(4)

2021年(12)

2020年(8)

2019年(18)

2018年(19)

2017年(9)

2016年(26)

2015年(18)

2014年(54)

2013年(20)

分类: C/C++

2014-04-04 00:23:41

Static成员


点击(此处)折叠或打开

  1. class B
  2. {
  3. public :
  4. static int val;
  5. };
  6. int B::val=0;
  7. class D :public B
  8. {
  9. };
  10. int _tmain(int argc, _TCHAR* argv[])
  11. {
  12. B::val=5;
  13. cout <<D::val<<endl;//5
  14. }


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

阅读(1753) | 评论(0) | 转发(0) |
0

上一篇:C语言中的字节对齐

下一篇:虚继承

给主人留下些什么吧!~~