赋值运算符中的引用返回[重复]

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.数组中重复的数字

PHP 中的引用赋值运算符 =&

c++中为啥赋值运算符重载返回类型是引用

在Java中,如何返回对对象的引用,以便可以使用赋值运算符修改对象

赋值运算符重载:返回 void 与返回引用参数

为啥赋值运算符要返回对对象的引用?