题目1
问
:
以下代码共调用多少次拷贝构造函数?Widget f(Widget u) { Widget v(u); Widget w=v; return w; } main(){ Widget x; Widget y=f(f(x)); }
知识点
:
- 传值传参和传值返回都会生成一个拷贝对象
- 中间对象·临时对象,在一般情况下,一个对象拷贝构造出一个临时对象,一个临时对象再去拷贝构造另一个对象,一般编译器会进行优化,中间对象优化掉,直接第一个拷贝第三个
(要求
:在一个表达式执行的连续步骤中)
例如
:f1(Widget());//优化(里面是一个匿名对象) ------------------- Wideget w;//不优化 f1(w);
分析
:
- 我们知道传值返回的时候会产生临时变量
看图
一共7次
题目2
问
:
设已经有A,B,C,D4个类的定义,程序中A,B,C,D构造和析构函数调用顺序为?C c; int main() { A a; B b; static D d; return 0; }
知识点
:
- 构造函数是在对象定义的时候调用的,析构函数是在对象销毁(生命周期)的时候调用的
- 局部对象的生命周期是在定义的函数体内,局部静态对象生命周期在main函数结束后结束
局部静态对象是在第一次调用当前域函数的时候初始化不会第二次定义
(不同于局部对象存储在当前栈帧上,他是存储在静态区上,在main函数结束后才销毁
)- 全局对象的生命周期(定义在main函数之前,析构在main函数结束之后)
局部的静态对象先析构
,单个文件内多个全局对象析构是按照他们的声明顺序来走的
分析
:
- D为局部静态对象,A,B为局部对象,C为全局对象
所以:
构造顺序
:C A B D,析构顺序
:~B ~A ~D ~C