C++ 复制与析构问题

我不明白第二行的复制构造函数是怎么来的,下面的析构函数又是什么?另外最后两个析构函数,先析构的B对象,最后析构的i对象吗?... 我不明白第二行的复制构造函数是怎么来的,下面的析构函数又是什么?
另外最后两个析构函数,先析构的B对象,最后析构的i对象吗?
展开
 我来答
物理公司的
2014-05-07 · TA获得超过5695个赞
知道大有可为答主
回答量:6105
采纳率:86%
帮助的人:1342万
展开全部

在C++中,下面三种对象需要调用复制构造函数:


1) 一个对象作为函数参数,以值传递的方式传入函数体;


2) 一个对象作为函数返回值,以值传递的方式从函数返回;


3) 一个对象用于给另外一个对象进行初始化(常称为赋值初始化);

那么++i只是单独调用了operator++函数,它又没有传递给别的对象,怎么就调用复制构造函数了呢?

T& fun()
{
    return *this;
}
返回的是类的引用,因此没调用复制构造函数
T fun()
{
    return *this;
}
这里就调到复制构造函数了

之前num& operator++(const num&s),该输出消失的回答就是第一种,你的是第二种


之前我也回答了你的问题,给分。。。。。。。

abcd1236386
2014-05-07 · TA获得超过774个赞
知道小有建树答主
回答量:539
采纳率:0%
帮助的人:524万
展开全部
复制构造函数是因为你的++操作符的返回值是num,这样返回的是一个临时变量,将自身拷贝复制给这个临时变量,临时变量生成之后,立马又被销毁了,所以就有了析构函数。
严格来说是你写错了,应该写成 num & operator ++(){} ,这样就不会有了。因为返回的是引用。
追问
哦,是这样,那我就明白了。
那麻烦再问一下,我知道改成&之后会消失,但是我不明白,
如果说 num b=++i;这种对象之间的传递会调用复制构造函数。
那么++i只是单独调用了operator++函数,它又没有传递给别的对象,怎么就调用复制构造函数了呢?
追答
这个是c++的高级原理。
当函数返回的时候,需要一个额外的临时变量。而返回引用就不需要额外
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
韩靓127
2014-05-07
知道答主
回答量:21
采纳率:0%
帮助的人:16.8万
展开全部
重载了自增操作operator++,因为函数的返回值在栈中,程序就创建了一个匿名对象。将函数改为num& operator++(const num&s),该输出消失。
追问
什么叫匿名对象? 是临时副本吗?
追答
对。是系统自动生成的,没有名字的对象。匿名对象的产生对程序的正确性没有影响,但是对象的创建和销毁有内存开销和运行时间的开销,因此要对于复杂度较高、对计算能力要求较高的程序,通过使用指针和引用,尽量避免匿名对象的产生。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
stushl
2014-05-07 · TA获得超过329个赞
知道小有建树答主
回答量:730
采纳率:50%
帮助的人:335万
展开全部
有点乱,没看明白
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式