跟我一起深度探索C++对象模型
解析经典书籍,深度理解学习C++对象模型。
MISAYAONE
勤学如春起之苗,不见其增,日有所长。
展开
-
深度探索C++ 对象模型【第五章2】
1:当C++类导入继承机制,出现虚函数之后,vptr使得class产生了膨胀作用构造函数附加了代码,将vptr初始化class必须合成一个拷贝构造函数和赋值构造函数,其现在是nontrival的(简单的位拷贝不能满足需求)。但其默认的析构函数仍然是trival的2:C++标准要求编译器尽量延迟必要成员函数(构造、拷贝)的实际合成操作,直到真正需要时才合成。3:拷贝构造函原创 2017-11-08 21:32:56 · 412 阅读 · 0 评论 -
深度探索C++ 对象模型【第六章1】
1:如果对象仍然存活,而程序有一个以上的离开点,那么析构函数就会被放置在每一个离开点之前的位置,即使很有可能程序执行不到后面的离开点。所以一般而言,我们会将对象尽可能放置在使用它的那个程序区的附近,这样做可以节省非必要的对象产生和销毁操作。(用的时候再定义,会是一个好的选择)2:对于全局对象而言,C++会保证在main()函数中第一次用到全局对象之前,把该全局对象构造出来,而在main原创 2017-11-09 17:27:23 · 360 阅读 · 0 评论 -
深度探索C++ 对象模型【第七章1】
1:template编程风格它是标准模板库(STL)的基础参数化技术2:template类,定义一个指针指向特定的实例时,程序中并没有发生什么,因为指针并不是对象,编译器不需要知道与该class有关的任何成员数据或者对象的分布。所以编译器现在已经禁止了声明一个指向某个模板类的指针。3:然而定义一个引用时,会真的实例化一个template class的实例,0也会被转化为原创 2017-11-13 09:23:19 · 593 阅读 · 0 评论 -
深度探索C++ 对象模型【第五章3】
1:总结一下拷贝赋值运算符较为复杂,不做细节讨论其在虚拟继承下行为不佳,需要加以小心的设计和使用说明建议尽可能不要允许虚基类函数的拷贝操作建议不要在虚基类函数中声明数据2:Explict Initialization List 要注意和成员初始化列表相区别开来。Point A = {1,2,3};//显示初始化列表//与构造函数中的成员初始化列表有明显的区别3:总原创 2017-11-11 09:02:12 · 766 阅读 · 0 评论 -
深度探索C++ 对象模型【第五章1】
1:拥有纯虚函数的基类不可能拥有实例对象。virtual =02:一般而言,class 的data member应该被初始化,而且只能以两种方式初始化在constructor中指定初值在member function 中指定初值任何其他的初始化操作都会破坏封装的特性,使得class的维护和修改变得困难。3:C++中,纯虚函数是可以定义和调用的,但是其只能被静原创 2017-11-09 09:11:43 · 576 阅读 · 0 评论 -
深度探索C++对象模型 【第四章2】
1:关于取地址的艺术~直接取一个非静态成员变量的地址时,得到的是其在class中的真实offset再加1。当绑定到真实的对象上再取其地址时,得到的是其在内存中的真正地址。取一个非静态成员函数的地址时,得到的是其在内存中真正的地址,但是要存取该函数,也需要对象的地址来配合。直接存取一个静态成员变量的地址时,无论通过对象还是class,得到的都是其在内存中的真正地址。直接存取一个静态成员函原创 2017-11-07 09:16:58 · 370 阅读 · 0 评论 -
深度探索C++对象模型【第三章2】
1:通过对象指针还是对象来存取数据成员之间的差异:当该类是一个派生类,且其继承链中有一个虚基类存在,并且存取的member成员是一个从该虚基类中继承而来的成员时,就会有重大的差异。此时通过指针来存取的话,由于多态机制的存在,指针所绑定的对象类型要到执行期才能确定,所以存取的操作也必须延长到执行期;但是如果使用对象来存取,就不会有这样的问题存在,成员的offset在编译器就能够确定。原创 2017-11-06 09:16:16 · 524 阅读 · 0 评论 -
深度探索C++对象模型 【第四章1】
1:静态成员函数(static member function)不可能是做到以下两点:不可能直接存取非静态成员变量不可能被声明为const原创 2017-11-06 09:23:18 · 756 阅读 · 0 评论 -
深度探索C++对象模型【第三章1】
1:编译器会为每一个空class安插一个char,使得这个class的两个objects对象在内存中配置独一无二的内存地址。这就解释了空类的大小为何为1(即使该类为派生类,也需要为其安插一个char来区分其对象)。(传统意义上这个char会被放到class 的尾端)2:class 的大小主要和以下三种因素相关:虚拟机制带来的负担:一个指针,或是指向一个相关的vbtl,或是一个虚基类原创 2017-11-05 09:28:04 · 468 阅读 · 0 评论 -
深度探索C++ 对象模型【第二章1】
1:在C++的构造函数上,往往编译器会做很多你不知道的事,就比如说构造函数的隐式转换,虽然有时候很方便,但是在某些情况下会造成一些意想不到的情况发生,explict关键词就因此而生~!2:当编译器需要时,才会合成一个default constructor出来(默认构造函数)。被执行出来的默认构造函数只能执行编译器所需的行动,它不会满足程序本身的需要。下面讨论四种必须为class合成一个构造函数原创 2017-11-04 09:00:58 · 733 阅读 · 0 评论 -
深度探索C++ 对象模型【第二章2】
1:NRV的优化会出现在,函数以传值的方式传回一个类对象,当该类有一个拷贝构造函数时,编译器会对你的代码进行一定的背后优化。2:成员初始化时,当出现以下四种情况,必须使用成员初始化列表的操作:初始化一个引用reference成员时初始化一个常量const成员时当调用一个base的构造函数,而基类的构造函数拥有一组参数时当调用一个成员类对象的构造函数时,且该成员类的构造函数拥原创 2017-11-04 09:02:49 · 655 阅读 · 0 评论 -
深度探索C++ 对象模型【第一章1】
几个值得注意的点:1:在C语言中,数据和处理数据的操作(函数)是分开声明的。C语言本身没有支持“函数与数据”之间的关联性。这种程序方法叫做程序性,算法函数处理的是外部的数据。2:在C++中,我们使用ADT(抽象数据类型abstract data type)来实现函数与数据的封装。3:C++的这种做法不一定比C语言更好,因为有额外的时间成本与空间成本在内,如书中所说:“C原创 2017-10-24 22:42:12 · 642 阅读 · 0 评论 -
深度探索C++ 对象模型【第一章2】
1:为了维护与C之间的兼容性,C++保留了关键词struct。那么我们具体要在什么时候来去对class和struct作出用法区分呢?原创 2017-11-03 09:00:44 · 679 阅读 · 0 评论 -
深度探索C++ 对象模型【第一章3】
1:在继承关系中,不存在从基类到派生类的隐式类型转换2:派生类到基类的自动类型转换只对指针或是引用有效3:ADT 抽象数据类型,现在也被称为OB(object based)一个典型的例子就是string 这个类,这是一种非多态的数据类型string class 展示了封装的非多态形式,它提供了一个public接口和一个private实现品,包括数据和算法,但唯一不支持的就是类型原创 2017-11-03 09:01:45 · 589 阅读 · 0 评论 -
深度探索C++对象模型之前言
为什么要学习C++对象模型?侯捷大师给出的答案是:C++的一个特殊之处就是编译器会帮程序员做很多的“事”:对象的构造函数、析构函数、虚拟继承、多态、拷贝构造函数等等,它会为我们合成一系列的额外函数(还可能会包含一些运算符),有时候它还会扩张我们所写的函数内容,放入更多的操作,更甚者会给我们的“对象”本身加入很多“奇奇怪怪”的内容。学习此书解决了我们对于C++底层实现机制的困惑。个人原创 2017-10-09 17:02:14 · 532 阅读 · 0 评论