2.2 复制构造函数的构造操作
2015-07-16 22:54
148 查看
Q1:复制构造函数分为两类:trivial 和 nontrivial ——只有nontrival的实例才会被合成在程序中
Q2:“bitwise copy semantics”
1) Eg: 展现 bitwise copy sematics
这种情况下并不需要合成默认复制构造函数,因为上述声明展现了默认赋值语义学
2) Eg:不展现 bitwise copy semantics
• 编译器必须合成出复制构造函数,以便调用类成员String 对象的复制构造函数
合成的复制构造函数如下:
Q3:不展现 “bitwise copy semantics”的四种情况:
Q4:重新设定 virtual table 的指针
Eg: 如下图所示:
Q5:复制构造函数调用的三种情况:
[code]决定一个复制构造函数是否为 trivial 的标准在于:类是否展现出所谓的“bitwise copy semantics”(逐比特拷贝语义学)
Q2:“bitwise copy semantics”
1) Eg: 展现 bitwise copy sematics
[code]class A { public: A(const char *) ; ~A(); int ival; char * cval; };
这种情况下并不需要合成默认复制构造函数,因为上述声明展现了默认赋值语义学
2) Eg:不展现 bitwise copy semantics
[code]class B { public: B(const String&); ~B(); //… int ival; String sval; }; class String { String(const char *); String(const String&); ~String(); }
• 编译器必须合成出复制构造函数,以便调用类成员String 对象的复制构造函数
合成的复制构造函数如下:
[code]inline B::B(const B & b) { sval.String::String(b.sval); ival = b.ival; }
Q3:不展现 “bitwise copy semantics”的四种情况:
[code]1) 当类含有一个成员对象,而该成员对象类型声明了一个复制构造函数(不管是其显示声明,还是由编译器合成的) 2) 当类的基类存在一个复制构造函数时(不管是显示声明,还是编译器合成) 3) 当类声明了一个或者多个虚函数时 4) 当类派生自一个继承串链,且有一个或多个虚基类时
Q4:重新设定 virtual table 的指针
[code]• 编译器需要对每一个新产生的类对象的 vptr 正确的设置其初值,此时逐位操作将不再展现,需合成复制构造函数 • 对相同类类型的对象,逐位复制构造函数没有问题 • 将派生类对象使用复制构造函数构造基类对象时,需要使用合成复制构造函数,初始化正确的 vptr
Eg: 如下图所示:
Q5:复制构造函数调用的三种情况:
[code]1) 显示调用 Eg: X x = xx; 2) 当对象作为参数传递给某个函数时 Eg: void foo(X xx); 3) 当函数返回一个类对象时 Eg: X foo();
相关文章推荐
- HDU 5115 Dire Wolf(区间dp)
- HTTP协议之介绍
- c++中new分配动态数组
- 在Inspector 中 设置添加回调函数 - Unity3d编辑器扩展
- 我的Android进阶之旅------> Android为TextView组件中显示的文本添加背景色
- hdu1028 Ignatius and the Princess III(DP整数划分)
- 击穿缓存
- Lucene Query Term Weighting
- jQuery的事件委托实例分析
- javascript的typeof操作的返回值类型
- java集合框架——详解List、Set、Map
- [javascript]一种兼容性比较好的简单拖拽
- 系统优化与调度——非线性规划问题:梯度投影法之MATLAB实现
- 深入理解JavaScript系列(36):设计模式之中介者模式
- poj 1065 最长上升子序列
- 深入理解JavaScript系列(37):设计模式之享元模式
- Potocol Buffer详解
- nodejs+express +jade模板引擎 新建项目
- MyBatis知多少(9)不同类型的数据库
- hdu1029 Ignatius and the Princess IV(DP求数列中出现次数过半的数)