C++ ─── 匿名对象+变量的创建顺序

目录


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

        

版权声明:本文为博主作者:西北大程序猿原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/m0_73751295/article/details/138259110

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2024年5月6日
下一篇 2024年5月6日

相关推荐