临时变量
首先看一段代码:
#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++编译器会尽力避开临时对象
- 实际工程开发中需要人为的避开临时对象
网友评论