15、不一样的C++系列--临时变量

来源:互联网 发布:微信源码下载 编辑:程序博客网 时间:2024/06/01 08:33

临时变量


首先看一段代码:

#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++编译器会尽力避开临时对象
  • 实际工程开发中需要人为的避开临时对象
原创粉丝点击