您的位置:首页 > 编程语言 > C语言/C++

深度探索c++对象模型——读书笔记(一)

2016-08-24 21:25 281 查看
在c++中有

两种类数据成员:静态(static)与非静态(nonstatic)。
三种类成员函数:静态(static)、非静态(nonstatic)和虚拟(virtual)。
c++对象模型如下:

对于数据成员:nonstatic数据成员被配置在每一个类对象之内;static数据成员则存放在类对象之外。
对于成员函数:static、nonstatic成员函数被配置在类对象之外(代码段)。virtual成员同样放置在代码段中。但需要通过以下两个步骤进行支持。

每一个class(类)产生出一组指向虚函数的指针,放在表格中。这一表格被称为虚函数表(vtbl)。
每一个类对象被安插一个指针,指向相关的虚函数表。这一指针被称为虚函数指针。每一个class所关联的type_info object也经由虚函数指针被指出来,通常放在表格的第一个slot中。
当一个base class objec被直接初始化为(或是被指定为)一个derived class object时,derived object就会被切割(sliced)以塞入较小的base type内存中,derived type将没有留下任何蛛丝马迹。

对于默认的构造函数,共有以下四种情况使默认构造函数是有意义的。

1)“带有default constructor”的member class object

如果一个class没有任何constructor,但它内含一个member object,而后者有default constructor,那么这个类的“隐式默认构造函数”就是有意义的,编译器需要为该class合成出一个默认构造函数。

如果class A内含一个或一个以上的member class object,那么class A的每一个constructor必须调用每一个member class的默认构造函数。编译器会扩张已存在的constructor,在其中安插一些代码,使得user code被执行之前,先调用必要的默认构造函数。
如果有多个class member object都要求constructor初始化操作,c++语言要求以“member object”在class中的声明顺序来调用各个constructor。

2)“带有default constructor”的base class

如果一个没有任何constructor的class派生自一个“带有默认构造函数”的基类,那么这个derived class的默认构造函数会被认为是有意义的。它将调用上一层base class的默认构造函数。

3)“带有virtual function”的class

4)“带有virtual base class”的class

一个类在以下四种情况不会展现“bitwise copy semantics”,这里所谓的“不会展现bitwise copy semantics”,我的理解是不会直接逐位的拷贝数据,而是调用相应的拷贝构造函数。

当class内含一个member object而后者的class声明有一个拷贝构造函数。
当class继承自一个基类,而后者存在一个拷贝构造函数。
当class声明了一个或多个虚函数时。
当class派生自一个继承串链,其中有一个或多个虚基类时。
在以下四种情况下必须使用成员初始化列表:

当初始化一个reference member。
当初始化一个const member。
当调用一个base class的constructor,而它拥有一组参数时。
当调用一个member class的constructor,而它拥有一组参数时。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: