目录
1. 匿名对象(临时对象)
2. 编译器的优化
3.变量的创建与销毁
1. 匿名对象(临时对象)
我们先来看有名对象的创建
Date d1;Date d2(2024,4,27);
匿名对象的创建
Date(2024,56,1);
生成了一个匿名对象,执行完Date(2024,5,1),此匿名对象就消失了。
注意:
匿名对象的生命周期为当前行。
匿名对象具有常性。
★★★产生匿名对象(临时对象)的情况:
1. 传值传参(先将值转为匿名对象)
2. 类型转换
3.传值返回
2. 编译器的优化
1. 在连续的表达式中, 构造+拷贝构造------》优化成一个构造
eg: 传值传参
2. 连续的表达式中,拷贝构造+拷贝构造-----》优化成一个拷贝构造
eg: 接受传值返回
3. 连续的表达式中,赋值重载+拷贝构造可能不会优化
4. 有些编译器也可能跨行优化,过度优化。
3.变量的创建与销毁
★ 在同一个栈帧中,后定义的先析构,后进先出(编译器自动)
★ 局部的静态变量如(下面的D),生命周期是全局,且只会在第一次调用时进行构造,第二次不进行构造
//设已经有A,B,C,D4个类的定义,程序中A,B,C,D析构函数调用顺序为?C c;void main(){ A*pa=new A(); B b; static D d; delete pa;}
答案:A B D C
分析: 首先手动释放pa, 所以会先调用A的析构函数,其次会跟定义相反的顺序释放局部对象,这里只有b,就释放b,再释放静态局部对象d,再释放全局对象c( D和C相当于在一个栈帧定义的,且是C先定义,D后定义)
如果去除delete pa;
答案是 B A D C