2 anhaoxuan anhaoxuan 于 2016.04.30 16:44 提问

关于C++后置运算符重载一个超简单问题

以下代码
#include
using namespace std;
class num
{
public:
num(){n=1;cout<<"构造函数执行\n";}
num(int i){n=i;cout<<"带一个参数的构造函数执行\n";}
num(const num&s){this->n=s.n;cout<<"复制构造函数执行\n";}
~num(){cout<<"析构函数执行\n";}
int get()const{return n;}
void set(int x){n=x;}
void add(){++n;}

const num operator++(int o)
{
    num temp(*this);
    ++n;
    return temp;
}

private:
int n;
};
int main()
{
num i;
cout<<"i:"<<i.get()<<endl;
i.add();
cout<<"i:"<<i.get()<<endl;
num n=i++;
cout<<"i:"<<i.get()<<endl;
cout<<"n:"<<n.get()<<endl;
return 0;
}

运行后显示

构造函数执行
i:1
i:2
复制构造函数执行
复制构造函数执行
析构函数执行
i:3
n:2
析构函数执行
析构函数执行

请问为什么要执行两次复制构造函数 复制构造的都是什么?
还有请问依次析构的三个对象是什么?
谢谢!!

4个回答

passer_by_hq
passer_by_hq   2016.04.30 17:11
已采纳

第一次构造:num i;
第二次构造:num=i++;重载了++运算符,在里面num temp时
第三次复制构造:return temp;
这三次都调用了析构函数

anhaoxuan
anhaoxuan 回复passer_by_hq: 谢谢您!!!祝您平安 幸福
一年多之前 回复
passer_by_hq
passer_by_hq 嗯可以
一年多之前 回复
anhaoxuan
anhaoxuan 那么我能不能理解为 析构函数三次调用析构掉的分别是 return temp副本;num n;num i
一年多之前 回复
passer_by_hq
passer_by_hq 应为return temp要临时创建一个副本用来保存你要返回的数据,以便后面调取,因为在这个函数结束时所有的局部数据都将会清空,return只有临时创建一个临时副本空间,一到完成return传送,这个副本也会被释放
一年多之前 回复
anhaoxuan
anhaoxuan 不太懂您说的是什么意思 return temp怎么能算函数呢
一年多之前 回复
CSDNXIAON
CSDNXIAON   2016.04.30 16:52

C++中关于重载后置++运算符的问题
C++ 后置运算符重载 =
++运算符的重载前置与后置
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

anhaoxuan
anhaoxuan 谢谢 但是没有帮助到我
一年多之前 回复
weixin_32662675
weixin_32662675   2016.05.01 11:05

const operator ++
里面会调用两次拷贝构造函数 一次析构函数

然后主函数会调用两次析构函数

ZGZ1002
ZGZ1002   2016.05.02 14:47

第一次构造:num i;
第二次构造:num=i++;重载了++运算符,在里面num temp时
第三次复制构造:return temp;
这三次都调用了析构函数

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!