编译器合成的trivial构造函数不执行任何操作。只有nontrivial的构造函数才执行有用的操作。其实implicitly default constructor并没有被合成出来。
trivial和nontrivial是指编译器自动生成的构造函数。
不含有任何构造函数的类,编译器为其合成nontrivial构造函数有以下四种情况:
1.该类中的对象成员含有默认构造函数。(按声明顺序依次调用成员对象的默认构造函数)(疑问:如果对象成员也没有给出默认构造函数,该类由编译器合成的构造函数是trivial还是nontrivial.我觉得应该是trivial的。求解。20110718).
2,该类的基类中含有默认构造函数。(合成的nontrivial构造函数调用基类的默认构造函数)
3.该类存在virtual函数。(因为要构造virtual function table,并生成和初始化vbtptr)。
4 。该类的继承体系中存在virtual base class.(决定virtual base class 在派生类中的位置,在执行期之前准备妥当。)
除以上此种情况外,合成的构造函数都是trivial的。
但类中又不止一个构造函数,但不存在默认构造函数时,编译器不能自动生成默认构造函数,因为只有在不含有任何构造函数的时候编译器才会implicitly 合成默认构造函数。此时他会将每一个构造函数扩展,加入一些代码。以确保在用户代码执行前执行default constructor 的功能。
当class展现出bitwise copy semantics时不自动合成一个copy constructor,而当class不展现出bitwise copy semantics时会自动合成一个copy constructor
当一个Class的某个member object存在copy constructor(无论是显式的还是隐式的),这各类就不显示bitwise copy semantics
当一个Class的基类(或基类的基类...)本身或其member存在copy constructor(无论是显式的还是隐式的),这各类就不显示bitwise copy semantics
位拷贝: "bitwise assignment "是指将一个对象的内存映像按位原封不动的复制给另一个对象,
所谓之拷贝就是指,将原对象的值复制一份给新对象。比如:
class String{
private:
char *s_;
...
}
在用 "bitwise assignment "时会直接将对象的内存映像复制给另一个对象,
这样两个对象会指向同一个内存区域,当一个对象被释放后,
另一个对象的s_指针会成为空指针。这时,就应该编写operator=
和copy constructor来实现值拷贝 .copy constructor总的目的就是为了避免内存泄漏。
《深度探索C++对象模型〉〉一书上总的思想就是,在编译阶段,如果产生一个对象,编译器需要为该对象添加额外的一些东西(简单的来说就是在类中添加一些指针),而是否要添加指针取决于你设计的类,什么时候才会添加指针呢?
总结一共有这几种情况,:
1,如果类中有虚函数的时候,这时候编译器要添加指向虚函数表的指针。比如,
A a;//编译器为该对象添加一指针指向虚函数
A b(a);//如果没有copy constructor,这个时候,bitwise copy,这个时候,a和b的指针指向统一块内存。当某个对象销毁的时候,会出现错误。
2,如果是虚继承//和上面一样
3,带有default copy constructor的base class。如果不产生缺省的构造函数,则copy 时,只copy要调用子类的成员而没有copy父类的成元。
4,如果该类中没有构造函数,但是该类的一个成员,该成员有缺省的 copy constructor,则编译器必须为该类构造一个缺省的copy constructor。
C++新手的误解:
1.任何类如果不含有默认构造函数就会合成一个。
2.被合成出来的构造函数会初始化类中每一个data member(只有类对象被初始化)。
2011年8月18日 初次阅读,理解尚浅,难免有所错误。在此留下标记,方便以后回来查漏补缺。
分享到:
相关推荐
深度探索C++对象模型的阅读笔记,可以看看别人是怎么学习C++的
深度探索C++对象模型 C++程序员必看编程书籍
深度探索c++对象模型(2012版本)
深度探索C++对象模型
深度探索C++对象模型读书笔记
深度探索C++对象模型_中英 深度探索C++对象模型_中英 深度探索C++对象模型_中英
深度探索C++对象模型 第0章 导读(译者的话) 第1章 关于对象(Object Lessons) 加上封装后的布局成本(Layout Costs for Adding Encapsulation) 1.1 C++模式模式(The C++ Object Model) 简单对象模型(A Simple...
深度探索C++对象模型 PDF中文清晰版.zip深度探索C++对象模型 PDF中文清晰版.zip深度探索C++对象模型 PDF中文清晰版.zip深度探索C++对象模型 PDF中文清晰版.zip深度探索C++对象模型 PDF中文清晰版.zip深度探索C++对象...
书中涵盖了C++对象模型的语意暗示,并指出这个模型是如何影响你的程序的。 对于C++底层机制感兴趣的读者,这必然是一本让你大呼过瘾的绝妙好书。如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么...
《深度探索C++对象模型》专注于C++面向对象程序设计的底层机制,包括结构式语意、临时性对象的生成、封装、继承,以及虚拟——虚拟函数和虚拟继承。这本书让你知道:一旦你能够了解底层实现模型,你的程序代码将获得...
深度探索C++对象模型 超高清
深度探索C++对象模型 中文图片影印版pdf,比较清晰,不是那种模糊的版本,和文字版差别不大 英文清晰文字版chm 第一代C++编译器开发主管所写。如果你想成为真正的C++高手,看这本书,他为你讲述了编译器在处理各种...
inside c++ object Model && JJ.Hou中译本 《深度探索C++对象模型》
深度探索C++对象模型.pdf,本书系统有深度的阐述C++面向对象,解释其本质!
深度探索C++对象模型(侯捷 著).pdf 清晰版
深度探索C++对象模型(清晰版).pdf