深度探索C++对象模型 第五章 构造、析构、拷贝语意学

1、 const 成员函数需要吗? 尽量不要,如果存在继承,则无法预支子类是否有可能改变data member

2、 pure virtual constructor 可以实现类的隐藏吗(包含data member)?   这样子类无法调用base 的构造函数对数据初始化,所以可以用protected来实现构造函数,可以实现子类调用;

3、 如果class中存在virtual function,则编译器会再构造函数中对vptr进行初始化(在base构造函数调用之后,而代码实现之前)

4、拷贝构造函数或者assignment 构造函数中不会对vptr进行修改,vptr仍会指向自己的vtable(所以带有vfunction的拷贝和赋值构造函数,不会应用bitwise,而是和class 中有object member一样,使用memberwise )

5、member initiaization list 实现data member的初始化操作,以及data member中object 成员的初始化操作,效率较高;如果在constructor中实现,则是赋值操作,会伴随内存移动; 当然编译器可以进行相应优化,将本体实现的赋值优化为初始化操作(NRV no result value)

一个class

class Point {

public:

Point();

Point(const Point&);

Point& operator=(const Point&);

virtual ~Point();

}

6、继承体系下的对象构造

1) 记录在member initialization list中的data members初始化操作会背放进constructor的函数本体,并以member声明顺序初始化

2) 如果一个member没有在初始化列表中,但它有一个default constructor,则必须被调用

3)  在那之前,如果class object有virtual table pointers,则必须被设定初值

4) 在那之前,所有的base class constructors必须被调用,以base class的声明顺序为顺序;

5) 在那之前,所有的virtual base class constructors必须被调用,从左到右(不是很理解)

7、 constructor和destructor中直接调用虚拟函数,则将每一个调用都以静态方式绑定,因为还无法确定具体是哪个虚拟函数。

深度探索C++对象模型 第五章 构造、析构、拷贝语意学

时间: 2024-11-08 02:08:14

深度探索C++对象模型 第五章 构造、析构、拷贝语意学的相关文章

【深度探索C++对象模型】第一章 关于对象

第一章 关于对象(Object Lessons) -- 本书作者:Stanley B.Lippman 一.前言 什么是 C++ 对象模型:简单的说,就是 C++ 中面向对象的底层实现机制. 本书组织: 第 1 章,关于对象(Object Lessons),介绍 C++ 对象的基础概念,给读者一个粗略的了解. 第 2 章,构造函数语意学(The Semantics of Constructors),构造函数什么时候会被编译器合成?它给我们的程序效率带来了怎样的影响? 第 3 章,Data语意学(T

【深度探索C++对象模型】第二章 构造函数语意学(上)

第二章 构造函数语意学(The Semantics of Constructors) -- 本书作者:Stanley B.Lippman 一.前言 首先让我们来梳理一个概念: 默认构造函数(Default Constructor) : 是在没有显示提供初始化式时调用的构造函数.它由不带任何参数的构造函数,或是为所有形参提供默认实参的构造函数定义.如果定义的某个类的成员变量没有提供显示的初始化式时,就会调用默认构造函数(Default Contructor). 如果用户的类里面,没有显示的定义任何

深度探索C++对象模型 第三章 Data 语意学

一个有趣的问题:下列 类 sizeof大小 class X{}    //1 class Y:public virtual X{} //4 or 8 class Z:public virtual X{} // 4 or 8 class A:public Y,public Z{} // 8 or 12 主要原因:为了保持每一个类生成对象在内存中的唯一性,编译器必须要给空类生成一个char来维持object的唯一性: 而virtual继承中,仅保持了base class的指针,有些编译器会继承bas

深度探索C++对象模型第6章 执行期语意学

(一)对象的构造和析构(Object Construction and Destruction) 一般而言我们会把object尽可能放置在使用它的那个程序区段附近,这么做可以节省非必要的对象产生操作和摧毁操作. 全局对象 如果我们有以下程序片段: Matrix identity main() { //identity 必须在此处被初始化 Matrix m1=identity; ... return 0; } C++保证,一定会在main()函数中第一次用到identity之前,把identity

深度探索C++对象模型之第二章:构造函数语意学之Default constructor的构造操作

C++新手一般由两个常见的误解: 如果任何class没有定义默认构造函数(default constructor),编译器就会合成一个来. 编译器合成的的default constructor会显示的设定“class内每一个data member的默认值” 一.编译器在哪种情况下才会合成默认构造函数: 对于未声明构造函数的类,只有在以下四种情况下编译器才会为它们合成默认构造函数: 类的成员有一个类对象(Member Class Object),且该成员含有默认构造函数(default Const

《深度探索C++对象模型》第二章 | 构造函数语意学

默认构造函数的构建操作 默认构造函数在需要的时候被编译器合成出来.这里"在需要的时候"指的是编译器需要的时候. 带有默认构造函数的成员对象 如果一个类没有任何构造函数,但是它包含一个成员对象,该成员对象拥有默认构造函数,那么这个类的隐式默认构造函数就是非平凡的,编译器需要为该类合成默认构造函数.为了避免合成出多个默认构造函数,编译器会把合成的默认构造函数.拷贝构造函数.析构函数和赋值拷贝操作符都以内联的方式完成.一个内联含有具有静态链接,不会被文件以外者看到.如果函数不适合做成内联,就

Android深度探索-卷1第五章心得体会

S3C6410是由三星公司推出的一款低功耗.高性价比的RISC处理器,开发是,首先安装minicom串口调试工具: 第一步:检测当前系统是否支持USB转串口. Lsmod | grep usserial 第二步:安装minicom apt-get install minicom 第三步:配置minicom: Minicom –s按提示和需要配置即可 第四步:测试minicom Minicom 烧写Android系统 使用Eboot擦除NandFlash的方法如下: 第一步:准备工作 第二步:进入

深度探索C++对象模型之第一章:关于对象之对象的差异

C++程序设计模型支持三种程序设计范式(programming paradiams). 程序模型(procedural model) char boy[] = "ccpang"; char *p_son; p_son = new char[strlen(boy) +1 ]; strcpy(p_son,boy); if(!strcmp(p_son,boy)) take_to_disneyland(boy); 抽象数据模型(abstract data type model) 此模型的抽象是

深度探索C++对象模型 第二章构造函数语意学

在使用C++时,常常会好奇或者抱怨,编译器为我们做了什么事呢? 为什么构造函数没有为我初始化呢?为什么我还要写默认构造函数呢? 2.1 Default Constructor 的构造操作 如果没有声明默认构造函数,编译器会在需要的时候帮我们产生出来. 为了避免在多个地方被需要导致重复,则编译器将产生的构造函数声明为inline方式. class Foo {public:Foo(), Foo(int) }; class Bar {public: Foo foo;char *str;} Bar ba