第二章 构造函数语意学 编译器何时合成拷贝构造函数?
来源:互联网 发布: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类的虚函数表地址;
}
- 第二章 构造函数语意学 编译器何时合成拷贝构造函数?
- 第二章 构造函数语意学 编译器何时生成默认构造函数?
- 第二章 构造函数语意学
- 拷贝构造函数 copy constructor 语意学
- 构造函数语意学
- C++构造函数语意学--编译器在哪些情况合成default constructot
- C++对象模型 第二章 构造函数语意学
- 第2章构造函数语意学
- Chap2-构造函数语意学
- 构造函数之语意学
- C++编译器合成默认构造函数的条件(合成默认拷贝构造函数雷同)
- C++构造与析构(14) - 编译器何时创建默认构造函数和拷贝构造函数
- 何时调用拷贝构造函数
- 编译器合成复制构造函数
- C++构造函数语意学——默认拷贝构造函数
- 第二章:拷贝构造函数
- 第五章 构造、析构、拷贝语意学
- C++编译器何时提供默认的构造函数和拷贝构造函数
- Linux系统安装时分区的选择(推荐)
- J-Link JTAG/SWD接口
- iOS界面编程-UIScrollView
- Java基础---集合之常用集合类的区别和联系、collections、泛型
- C语言操作符++、--学习难点
- 第二章 构造函数语意学 编译器何时合成拷贝构造函数?
- GSL wrapper example codes
- 生命周期管理流程图
- Shell下大于小于等于的特殊表示
- Dom4J操作xml文档
- maven学习问题--HibernateUtil不能初始化
- postgresql数据库操作指令学习
- Network Awareness in Windows Vista and Windows 7
- 接口继承多个