`
xitong
  • 浏览: 6222323 次
文章分类
社区版块
存档分类
最新评论

深度探索C++对象模型 第二章 读书笔记

 
阅读更多

编译器合成的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日 初次阅读,理解尚浅,难免有所错误。在此留下标记,方便以后回来查漏补缺。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics