class Test
{
int t;
public:
Test()
{
Test(0);
}
Test(int rec)
{
t = rec;
}
int getVal();
};
int Test::getVal()
{
return t;
}
这个程序,比较简单,说一下产生问题的点,类有两个构造函数,一个无参的,一个含有一个int类型的构造函数,程序的本意是在无参构造函数中利用都有参数的构造函数去初始化类,运行之后,查看t的值,是一个随机值。程序的结果和我们的本意是不同的,造成这个结果的原因是临时对象。
当我们Test o定义一个对象时,会调用无参的初始化函数,所以会进而调用Test(0),这里手工调用了构造函数,手工调用构造函数的结果是产生了一个新的临时对象,它的作用域只在当前这一条语句当中,而且作用域也是当前语句。所以这个无参的构造函数调用结束后只是产生了一个临时对象,然后就进行了销毁。我们定义的o对象的成员变量并没有初始化或者赋值,所以这就是为什么结果是一个随机值。如果想按照上述想法可以写成如下形式。
class Test
{
int t;
public:
Test()
{
*this = Test(0);
}
Test(int rec)
{
t = rec;
}
int getVal();
};
int Test::getVal()
{
return t;
}
这里我们把产生的临时对象赋值给了当前我们定义的对象。因为编译器默认提供了对象的重载赋值符号,所以会完成成员变量的浅拷贝。因为这里不涉及成员变量占用系统资源,所以浅拷贝是可以的。
但是在程序设计里,应该尽量避免临时对象的产生。编译器也会在不影响结果的调用下尽量少的产生临时对象。比如Test a = Test(0),语法来说应该是产生了一个临时对象然后调用拷贝构造函数初始化了a对象,但是编译器优化成了Test a(10),因为编译器这样做没有影响结果而且避免了临时对象。