第二章 构造函数语意学 编译器何时合成拷贝构造函数?

来源:互联网 发布:360 u盘数据恢复 编辑:程序博客网 时间:2024/05/20 08:27

首先要清楚位拷贝(浅拷贝)和值拷贝(深拷贝)的区别(参考http://blog.sina.com.cn/s/blog_a2aa00d70101gpvj.html)。位拷贝,及"bitwise copy"是指将一个对象的内存映像按位原封不动的复制给另一个对象,单纯地逐个bit拷贝;所谓值拷贝就是指,将原对象的值复制一份给新对象。在用"bitwise assignment"时会直接将对象的内存映像复制给另一个对象,这样两个对象会指向同一个内存区域,当一个对象被释放后,另一个对象的指针会成为空指针。

一般情况下,一个良好的编译器可以为大部分的class object产生bitwise copies,但是当不必要进行“bitwise copies”时,编译器会产生默认构造函数和拷贝构造函数,以下四种情况就是不需要“bitwise copies”(与前小节的情况一致,只是将默认构造函数替换成拷贝构造函数):

1)如果一个类没有拷贝构造函数,但是含有一个类类型的成员变量,该类型含有拷贝构造函数,此时编译器会为该类合成一个拷贝构造函数;

2)如果一个类没有拷贝构造函数,但是该类继承自含有拷贝构造函数的基类,此时编译器会为该类合成一个拷贝构造函数;

3)如果一个类没有拷贝构造函数,但是该类声明或继承了虚函数,此时编译器会为该类合成一个拷贝构造函数;

4)如果一个类没有拷贝构造函数,但是该类含有虚基类,此时编译器会为该类合成一个拷贝构造函数;

第三种情况正好解释了第一章“关于对象”的第二个问题,由于此时不在符合“bitwise copies”的语义环境,所以编译器会生成拷贝构造函数,在该函数中使虚函数指针仍指向该类的虚函数表地址,如(参考):

会自动给A类生成一个拷贝构造函数,函数中重新设置A类对象的vptr,大致如下:

A::A(const A& a)

{

    this->vptr=A类的虚函数表地址;
}



0 0