关于构造与析构函数
//为什么这个程序会有三个constructor而却有四个
//delete, 然后用return Complex(a+d.a,b+d.b);
//为什么都是只有三个?thx
#include <iostream>
using namespace std;
class Complex
{
int a;
double b;
public:
Complex(int a = 0,int b = 0)
{
this-> a = a;
this-> b = b;
cout < < "constructor " < < " " < <this-> a < < " " < <this-> b < <endl;
}
Complex operator+(const Complex& d) const
{
Complex c(1,1);
c.a = a + d.a;
c.b = b + d.b;
return c;
// return Complex(a+d.a,b+d.b);
}
~Complex()
{
cout < < "delete " < < " ";
cout < <a < < " " < <b < <endl;
}
};
int main()
{
Complex a(2,2), b(6,6), d = a + b;
// d = a + b;
}
[解决办法]
你现在的程序,三个构造,四个析构,原因在于在这个函数里:
Complex operator+(const Complex& d) const
{
Complex c(1,1);
c.a = a + d.a;
c.b = b + d.b;
return c;
}
返回的c 去构造了一个临时对象,而c构造这个对象调用的是拷贝构造函数,而你的程序里并没有实现它,所以你看不到这个构造过程.
但是,这个临时对象还是明确的被构造了的,所以系统最后要释放它,调用析构函数,
这就是你为什么看到三个构造四个析构的原因(有一个是拷贝构造函数产生的临时对象)
至于你的第二个问题,在用
return Complex(a+d.a,b+d.b);
语句返回的时候,就是三个构造三个析构了.
这是因为用这程语句返回对象时,系统自动优化掉了那个拷贝构造临时对象的过程,因此比上一种做法少了一个对象的产生.
这种方法叫 "RVO ", return value optimize
返回值优化.
它的任务就是少创建一个由拷贝构造函数生成的临时对象
有兴趣可以看看more effective c++