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

深度探索C++ 对象模型【第五章1】

2017-11-09 09:11 295 查看
1:拥有纯虚函数的基类不可能拥有实例对象。virtual =0

2:一般而言,class 的data member应该被初始化,而且只能以两种方式初始化

在constructor中指定初值
在member function 中指定初值
任何其他的初始化操作都会破坏封装的特性,使得class的维护和修改变得困难。

3:C++中,纯虚函数是可以定义和调用的,但是其只能被静态的调用,不能经由虚拟机制调用。

4:一个比较好的建议:不要讲虚析构函数定义为纯虚函数,定义为虚函数是比较好的~。

5:不将函数声明为const,意味着此函数不能获得一个const的指针或引用。但是这也就意味这该函数没有修改任何一个data member。有舍有得。

6:一般来说,对象有三种产生方式

global内存配置,全局对象的生命周期是和整个程序的生命周期相同的
Local内存配置,局部对象的生命周期是程序结束之前析构函数调用时结束的
heap内存配置(new出来的对象),堆上的对象的生命周期是从new到delete的
7:对于全局对象,其构造函数会在程序的起始处被调用,在程序exit()处调用其析构函数(exit()函数是由系统产生的,放在main函数结束之前)。注意:实际上,就想第三第四章所说的那样,有些类的没有必要的构造函数和析构函数要不是在实际情况下没有被定义出来,要不就是没有被调用。

8:在C++中,全局对象被视为完全定义,C++的所有全局对象都被以“初始化过的数据”来对待。

9:C++的类中如果只定义了数据,那么会被以Plain Ol data 来对待,也就是纯数据模式,这种情况下既没有析构函数也没有构造函数、拷贝构造函数的定义与调用。

10:当C++的类中出现了显式的构造函数,有public接口和private接口后,其大小并没有实际的改变(因为其没有虚函数机制)

11:显式的初始化列表方式会比其他的成员数据初始化方式效率更高。这是因为当函数的激活记录被放入程序堆栈时,上述的初始化列表就可以被放进对象的内存中去了。

12:显式的初始化列表带来了三个明显的缺点

只有当数据成员为public时,显式初始化列表才会比较的高效率
只能指定常量,因为它们在编译器就可以被评估求值
由于编译器并没有自动施行,所以初始化行为的失败可能性会变高
对于显式成员初始化列表的效率优点来说,平衡上面的软件工程上的缺点是不可能的。只有在四种特殊情况下必须使用初始化列表时,或者data member数据结构巨大(调色板数据、OGRE顶点数据)时,可以选择使用。此时显式的初始化列表比inline的构造函数效率还要高,特别是对全局对象来说。

13:无用的构造函数、拷贝构造函数、析构函数,实际上编译器并没有产生它们。

14:当C++的类出现继承性质时,虚函数的导入,理论上虚析构函数的定义会带来好处~

15:虚函数的出现,由于虚函数表,每一个对象都要付出vptr的代价(32位机器为4字节),如若是计算机图形学中的顶点,这样的负担就有点大了,所以在设计类的时候,需要统筹考虑到时间空间的负担和虚函数带来的弹性之间的优劣。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息