美文网首页
C++中的临时变量

C++中的临时变量

作者: nethanhan | 来源:发表于2017-10-14 10:34 被阅读0次

    临时变量


    首先看一段代码:

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

    相关文章

      网友评论

          本文标题:C++中的临时变量

          本文链接:https://www.haomeiwen.com/subject/kfjxuxtx.html