飞鸽 发表于 2013-10-8 16:16:57

C++复制构造函数

下面的代码理论上有四个对象,为什么却析构了3次,为什么??
#include <iostream>
using namespace std;

class Location
{
public:
        Location(int a, int b)
        {
                x = a, y = b;
                cout<<"Executing constructor"<<endl;
                cout<<"x = "<<x<<", y = "<<y<<endl;
        }
        Location(const Location& p)
        {
                x = p.x; y = p.y;
                cout<<"Executing copy_constructor."<<endl;
                cout<<"x = "<<x<<", y = "<<y<<endl;
        }
        ~Location()
        {
                cout<<"Executing destructor"<<endl;
        }

        double getx()
        {
                return x;
        }
        double gety()
        {
                return y;
        }
private:
        int x, y;
};

Location fun(Location p)
{
        int x, y;
        x = p.getx() + 1;
        y = p.gety() + 1;
        cout<<"x = "<<x<<", y = "<<y<<endl;
        return p;
}



void main()
{
        Location p1(5, 18);
        Location p2 = fun(p1);
}如果把最后一条代码改为:Location p2 = p1,那么p1赋值p2调用了复制构造函数,为什么多了fun(p1)就不析构了fun(p1)赋值给p2,其中fun函数就有调用了两个复制构造函数!!!
#include <iostream>
using namespace std;

class Location
{
public:
        Location(int a, int b)
        {
                x = a, y = b;
                cout<<"Executing constructor"<<endl;
                cout<<"x = "<<x<<", y = "<<y<<endl;
        }
        Location(const Location& p)
        {
                x = p.x; y = p.y;
                cout<<"Executing copy_constructor."<<endl;
                cout<<"x = "<<x<<", y = "<<y<<endl;
        }
        ~Location()
        {
                cout<<"Executing destructor"<<endl;
        }

        double getx()
        {
                return x;
        }
        double gety()
        {
                return y;
        }
private:
        int x, y;
};

Location fun(Location p)
{
        int x, y;
        x = p.getx() + 1;
        y = p.gety() + 1;
        cout<<"x = "<<x<<", y = "<<y<<endl;
        return p;
}



void main()
{
        Location p1(5, 18);
        Location p2 = p1;
}

回忆あ殇痛 发表于 2013-10-8 18:04:42

这是第一个程序运行图:

这是第二个程序运行图:

第一个程序,如果你调试的话,你会看到程序的运行顺序,当程序走到Location p1(5, 18);时,调用了构造函数Location(int a, int b);之后打印输出结果,程序接着运行到Location p2 = fun(p1);你会发现,先调用的是构造函数Location(const Location& p);之后打印输出结果,程序继续运行,此时调用函数Location fun(Location p);x,y的值分别+1,打印输出结果,此时的值是fun()函数里输出,之后返回p1,而不是x,y,所以值不发生改变,而后将p传入了构造函数Location(const Location& p),接着打印输出结果,至此,调用构造函数结束,接着调用3次析构函数。
第二个程序只是省略了调用Location fun(Location p);所以输出结果少一个析构函数。

飞鸽 发表于 2013-10-8 20:34:02

感谢你的回答,可是重点你还没有说到,首先更正下你的最后一句话,省略了Location fun(Location)依然会调用析构函数,你看你的第二个图就可以知道,调用了复制构造函数,也就会析构,前面一段话是对的,是调用了3次析构函数,fun(p1)执行函数调用就已经3次了,但 fun(p1)会返回一个对象p,假设Location p2 = p,那么又得调用一次复制构造函数,也就是要析构一次,难道你没观察出第二个程序正是说明了一个对象赋值个一个对象要调用复制构造函数吗???只不过第一个程序是返回一个对象赋值个一个对象,理论上已经4个对象,应该4次析构!只不过想不明白是怎么省略的。
页: [1]
查看完整版本: C++复制构造函数