我们知道构造函数是一个特殊的函数,那么如下问题:
1.是否可以之间调用?
2.是否可以在构造函数中调用构造函数?
3.直接调用构造函数的行为是什么?
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;
}
解决上述产生临时对象的问题:
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();
//下面两种写法在工程中是杜绝的
// Test().print();
// Test(10).print()
return 0;
}
直接调用构造函数将产生一个临时对象。
临时对象的生命周期只有一条语句的时间。
临时 对象的作用域值在一条语句中。
临时对象是C++中值得警惕的灰色地带。
现代的C++编译器在不影响结果的条件下会尽量减少临时对象的出现,
Test t = Test(10);
原本的执行过程: 1.生成临时对象,调用构造函数 2.用临时对象初始化 t 对象,调用拷贝构造函数。
现代的C++编译器在不影响结果的条件下会尽量减少临时对象的出现,也没有调用拷贝构造函数。
等效:
Test t = 10;