C++中的临时变量

临时变量


首先看一段代码:

#include <stdio.h>

class Test {
    int mi;
public:
    Test(int i) {
        mi = i;
    }
    Test() {
        Test(0);
    }
    void print() {
        printf("mi = %d\n", mi);
    }
};


int main()
{
    Test t;
    
    t.print();

    return 0;
}

这个时候可以想一想会输出什么? mi的值是什么?
运行结果如下:

mi = 515686454
  • 程序意图:

    • 在Test()中以0作为参数调用Test(int i)
    • 将成员变量mi的初始值设置为0
  • 运行结果:

    • 成员变量mi的值为随机值
  • 答案:

    • 直接调用构造函数将产生一个临时对象
    • 临时对象的声明周期只有一条语句的时间
    • 临时对象的作用于只在一条语句中
    • 临时对象是C++中值得警惕的灰色地带

那说到这里,如何避开这个陷阱,又能解决刚才的问题呢?

#include <stdio.h>

class Test {
    int mi;
    
    void init(int i)
    {
        mi = i;
    }
public:
    Test(int i) {
        init(i);
    }
    //在这里调用成员函数初始化,不能直接调用构造函数
    Test() {
        init(0);
    }
    void print() {
        printf("mi = %d\n", mi);
    }
};


int main()
{
    Test t;
    
    t.print();

    return 0;
}

小结:

  • 直接调用构造函数将产生一个临时对象
  • 临时对象是性能的瓶颈,也是bug的来源之一
  • 现代c++编译器会尽力避开临时对象
  • 实际工程开发中需要人为的避开临时对象
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,955评论 18 399
  • 你只是不愿相信,别人也知道努力这回事
    SpeedForce阅读 1,716评论 0 0
  • 悦己第三课拆解的是《金钱的灵魂》这本书。这本书不是一本理财书籍,而是从道的层面告诉我们怎么去打通和金钱的关系。 娟...
    元气满满的zm阅读 3,573评论 0 2
  • 今天的主题是一周所学,采用手帐的形式,因为群里每天的点评都有记录到简书,再采用结构思考力的“论证类比”,把所有评价...
    wendyy阅读 1,397评论 0 0
  • 遇到外省市的朋友,他们问你来自哪,只要说来自内蒙古就可以了,他们不在意你来自内蒙古的包头还是呼和浩特。如果在国外遇...
    应栗阅读 929评论 0 0