C++中神秘的临时对象
下面的程序输出什么?为什么?
#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;
}
1、程序意图:
---在Test()中以0作为参数调用Test(int i)
---将成员变量mi的值初始化设置为零
2、运行结果
---成员变量mi的值为随机值
结论
1、直接调用构造函数将产生一个临时对象
2、临时对象的生命周期只有一条语句的时间
3、临时对象的作用域只在一条语句中
4、临时对象是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;
}
例题分析2
#include <stdio.h>
class Test
{
int mi
;
public:
Test(int i
)
{
printf("Test(int i) : %d\n", i
);
mi
= i
;
}
Test(const Test
& t
)
{
printf("Test(const Test& t) : %d\n", t
.mi
);
mi
= t
.mi
;
}
Test()
{
printf("Test()\n");
mi
= 0;
}
int print()
{
printf("mi = %d\n", mi
);
}
~Test()
{
printf("~Test()\n");
}
};
Test
func()
{
return Test(20);
}
int main()
{
Test t
= Test(10);
Test tt
= func();
t
.print();
tt
.print();
return 0;
}
小结2
1、直接调用构造函数将产生一个临时对象
2、临时对象是性能的瓶颈,也是bug的来源之一
3、现代C++编译器会尽力避开临时对象
4、实际工程开发中需要人为的避开临时对象