您的位置:首页 > 编程语言 > C语言/C++

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

2017-06-11 11:39 176 查看

临时变量

首先看一段代码:

#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++ 临时变量