鱼C论坛

 找回密码
 立即注册
查看: 3344|回复: 2

C++复制构造函数

[复制链接]
发表于 2013-10-8 16:16:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
下面的代码理论上有四个对象,为什么却析构了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;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-8 18:04:42 | 显示全部楼层
这是第一个程序运行图:
1.png
这是第二个程序运行图:
2.png
第一个程序,如果你调试的话,你会看到程序的运行顺序,当程序走到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);所以输出结果少一个析构函数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-8 20:34:02 | 显示全部楼层
感谢你的回答,可是重点你还没有说到,首先更正下你的最后一句话,省略了Location fun(Location)依然会调用析构函数,你看你的第二个图就可以知道,调用了复制构造函数,也就会析构,前面一段话是对的,是调用了3次析构函数,fun(p1)执行函数调用就已经3次了,但 fun(p1)会返回一个对象p,假设Location p2 = p,那么又得调用一次复制构造函数,也就是要析构一次,难道你没观察出第二个程序正是说明了一个对象赋值个一个对象要调用复制构造函数吗???只不过第一个程序是返回一个对象赋值个一个对象,理论上已经4个对象,应该4次析构!只不过想不明白是怎么省略的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 13:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表