首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于构造与析构函数解决方法

2012-03-07 
关于构造与析构函数//为什么这个程序会有三个constructor而却有四个//delete,然后用returnComplex(a+d.a,b

关于构造与析构函数
//为什么这个程序会有三个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++

热点排行