赋值运算符中的引用返回[重复]
Posted
技术标签:
【中文标题】赋值运算符中的引用返回[重复]【英文标题】:Reference returning in assignment operator [duplicate] 【发布时间】:2013-05-26 01:48:29 【问题描述】:我试图了解在此代码中返回引用的目的是什么?仅仅是因为返回参考比复制快得多还是有其他更重要的东西?
class Container
public:
int Elems;
int * data;
Container(int n):Elems(n)data=new int[Elems];
Container operator= (const Container &rhs);
;
Container & Container:: operator= (const Container & rhs)
// I deleted the & and I can still compiled and make such things (a=b=c)
if(this!=&rhs)
if(data!=NULL)
delete [] data;
Elems=rhs.Elems;
data=new int[Elems];
for(int i=0;i<Elems;i++)
data[i]=rhs.data[i];
return *this;
【问题讨论】:
【参考方案1】:在 C++ 中,函数签名不依赖于返回类型,因此在重载时会忽略返回。
在 C++11 之前,返回值而不是引用会产生复制开销。
【讨论】:
此处按值返回必须返回 C++11 或更早版本的副本。您不能隐式地从*this
移出,或省略副本。【参考方案2】:
是的,这是为了避免不必要的副本。但是,在这个特定类的情况下,它需要正确性,因为没有适当的复制构造函数。此类的默认复制实例将导致多个实例共享同一个data
成员,并可能导致多次删除。
【讨论】:
感谢您的回复,但我无法理解您回答的部分内容。“此类的默认复制实例将导致多个实例共享相同的数据成员,并可能导致多次删除。”我的意思是如果我不能在那里写 & ,当我删除 c 对象中的部分数据时,它也会通过 b 和 a 对象被删除? 如果你写一个类的成员是分配内存的指针,你必须小心这个指针永远不会被泄露或双重删除。通常这意味着您需要定义析构函数和复制构造函数以及 operator=()。如果你没有定义一个复制构造函数(你没有,那是一个赋值函数),那么你会得到一个默认的复制构造函数,它会逐位复制对象;那么你将有两个对象都指向同一个data
数组,这最终会导致双重删除(或泄漏,如果没有删除数组。)
抱歉没有解释,假设有析构函数和复制构造函数,我没有写它们,因为我只是想知道我的代码的这部分,但你说得对,我应该解释一下。以上是关于赋值运算符中的引用返回[重复]的主要内容,如果未能解决你的问题,请参考以下文章
剑指offer 1.实现赋值运算符函数 2.数组中重复的数字