临时对象的产生
直接调用构造函数将产生一个临时对象。临时对象的生命周期只有一条语句的时间。临时对象的作用域只在一条语句中。临时对象是 C++ 中应当警惕的灰色地带。
#include <iostream>
using namespace std;
class Test {
private:
int mi;
public:
//有参构造函数
Test(int i) { mi = i; }
//无参构造函数
Test() { Test(5); //调用有参构造函数 }
void print() { cout << "mi = " << mi << endl; }
};
int main() {
Test t; //定义一个类对象,使用无参构造函数
t.print();
return 0;
}
输出结果:
mi = 0
结果分析
上面的代码,可以看出作者的意图是使用无参的构造函数调用有参构造函数,把对象的成员变量 mi 初始化为 5,但是实际结果却是 0(不同的编译器结果是不一样的,应该是随机值)。
Test() { Test(5); //调用有参构造函数 }
在执行 Test(5) 的时候就得到一个临时对象。因为我们知道,只要构造函数执行完,对象就创建好了,所以执行了 Test(5),就有一个对象被创建,这个对象连名字都没有,Test(5) 执行完之后这个对象就会被析构,所以上面的构造函数代码等同于,没有调用 Test(5)。
Test() { //Test(5); //调用有参构造函数 }

