美文网首页
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++中的临时变量

    临时变量 首先看一段代码: 这个时候可以想一想会输出什么? mi的值是什么?运行结果如下: 程序意图:在Test(...

  • c++11 右值引用和完美转发

    右值引用起到的作用。就是在c++中返回临时变量时,通过右值引用的方式将临时变量的内存窃为己用。减少了构造函数的开销...

  • C++中的成员变量和成员函数

    C++中的类有两个成分: (1)成员变量 成员变量按照作用域分为静态成员变量和非静态成员变量,C++中成员变量的默...

  • c++临时变量的作用域

    上上周周末翻《effective c++》,条款18看到一段代码: 看到这里的时候,猛然感觉有问题。在函数d(Mo...

  • C++ 变量和复合类型

    前面说了C++的基本数据类型,下面来看看在C++中如何定义变量和常量。 变量 定义和初始化 C++定义变量的方式和...

  • c++ python java

    c++ 初始化 C++类中成员变量的初始化有两种方式 - yu132563的专栏 - CSDN博客 C++ 变量初...

  • 在某些情况下,实参与引用参数不匹配,C++将生成临时变量

    如果实参与引用参数不匹配,C++将生成临时变量。当前,仅当参数为const引用时,C++才允许这样做。如果引用参数...

  • C++ 中的变量

    C++ 中的变量内存数据类型 C++ 数据类型 使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的...

  • 05 NDK-C++基础(一)

    1 C++对C的加强 1.1 namespace命名空间 1.1.1 C++命名空间基本概念 在C/C++中,变量...

  • c++ 引用

    概念 c++中,变量的引用就是变量的别名,因此引用(reference)又成为别名(alias)。 变量的引用 i...

网友评论

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

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