C++ 复制与析构问题
我不明白第二行的复制构造函数是怎么来的,下面的析构函数又是什么?另外最后两个析构函数,先析构的B对象,最后析构的i对象吗?...
我不明白第二行的复制构造函数是怎么来的,下面的析构函数又是什么?
另外最后两个析构函数,先析构的B对象,最后析构的i对象吗? 展开
另外最后两个析构函数,先析构的B对象,最后析构的i对象吗? 展开
展开全部
在C++中,下面三种对象需要调用复制构造函数:
1) 一个对象作为函数参数,以值传递的方式传入函数体;
2) 一个对象作为函数返回值,以值传递的方式从函数返回;
3) 一个对象用于给另外一个对象进行初始化(常称为赋值初始化);
那么++i只是单独调用了operator++函数,它又没有传递给别的对象,怎么就调用复制构造函数了呢?
T& fun()
{
return *this;
}
返回的是类的引用,因此没调用复制构造函数
T fun()
{
return *this;
}
这里就调到复制构造函数了
之前num& operator++(const num&s),该输出消失的回答就是第一种,你的是第二种
之前我也回答了你的问题,给分。。。。。。。
展开全部
复制构造函数是因为你的++操作符的返回值是num,这样返回的是一个临时变量,将自身拷贝复制给这个临时变量,临时变量生成之后,立马又被销毁了,所以就有了析构函数。
严格来说是你写错了,应该写成 num & operator ++(){} ,这样就不会有了。因为返回的是引用。
严格来说是你写错了,应该写成 num & operator ++(){} ,这样就不会有了。因为返回的是引用。
追问
哦,是这样,那我就明白了。
那麻烦再问一下,我知道改成&之后会消失,但是我不明白,
如果说 num b=++i;这种对象之间的传递会调用复制构造函数。
那么++i只是单独调用了operator++函数,它又没有传递给别的对象,怎么就调用复制构造函数了呢?
追答
这个是c++的高级原理。
当函数返回的时候,需要一个额外的临时变量。而返回引用就不需要额外
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
重载了自增操作operator++,因为函数的返回值在栈中,程序就创建了一个匿名对象。将函数改为num& operator++(const num&s),该输出消失。
追问
什么叫匿名对象? 是临时副本吗?
追答
对。是系统自动生成的,没有名字的对象。匿名对象的产生对程序的正确性没有影响,但是对象的创建和销毁有内存开销和运行时间的开销,因此要对于复杂度较高、对计算能力要求较高的程序,通过使用指针和引用,尽量避免匿名对象的产生。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
有点乱,没看明白
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询