题目--拷贝构造,析构,静态成员变量...

这里写目录标题

题目1


以下代码共调用多少次拷贝构造函数?

Widget f(Widget u)
{  
 Widget v(u);
 Widget w=v;
 return w;
}
main(){
 Widget x;
 Widget y=f(f(x));
}

知识点

  1. 传值传参和传值返回都会生成一个拷贝对象
  2. 中间对象·临时对象,在一般情况下,一个对象拷贝构造出一个临时对象,一个临时对象再去拷贝构造另一个对象,一般编译器会进行优化,中间对象优化掉,直接第一个拷贝第三个
    (要求:在一个表达式执行的连续步骤中)

例如

f1(Widget());//优化(里面是一个匿名对象)
-------------------
Wideget w;//不优化
f1(w);

分析

  1. 我们知道传值返回的时候会产生临时变量
  2. 看图
    在这里插入图片描述
    一共7次

题目2


设已经有A,B,C,D4个类的定义,程序中A,B,C,D构造和析构函数调用顺序为?

C c;
int main()
{
	A a;
	B b;
	static D d;
	return 0}

知识点

  1. 构造函数是在对象定义的时候调用的,析构函数是在对象销毁(生命周期)的时候调用的
  2. 局部对象的生命周期是在定义的函数体内,局部静态对象生命周期在main函数结束后结束 局部静态对象是在第一次调用当前域函数的时候初始化不会第二次定义(不同于局部对象存储在当前栈帧上,他是存储在静态区上,在main函数结束后才销毁)
  3. 全局对象的生命周期(定义在main函数之前,析构在main函数结束之后)
  4. 局部的静态对象先析构,单个文件内多个全局对象析构是按照他们的声明顺序来走的

分析

  1. D为局部静态对象,A,B为局部对象,C为全局对象

所以:
构造顺序:C A B D,析构顺序:~B ~A ~D ~C

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值