【问题标题】: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;
}

【问题讨论】:

    标签: c++ reference operator-overloading return-type


    【解决方案1】:

    在 C++ 中,函数签名不依赖于返回类型,因此在重载时会忽略返回。

    在 C++11 之前,返回值而不是引用会产生复制开销。

    【讨论】:

    • 此处按值返回必须返回 C++11 或更早版本的副本。您不能隐式地从 *this 移出,或省略副本。
    【解决方案2】:

    是的,这是为了避免不必要的副本。但是,在这个特定类的情况下,它需要正确性,因为没有适当的复制构造函数。此类的默认复制实例将导致多个实例共享同一个data 成员,并可能导致多次删除。

    【讨论】:

    • 感谢您的回复,但我无法理解您回答的部分内容。“此类的默认复制实例将导致多个实例共享相同的数据成员,并可能导致多次删除。”我的意思是如果我不能在那里写 & ,当我删除 c 对象中的部分数据时,它也会通过 b 和 a 对象被删除?
    • 如果你写一个类的成员是分配内存的指针,你必须小心这个指针永远不会被泄露或双重删除。通常这意味着您需要定义析构函数和复制构造函数以及 operator=()。如果你没有定义一个复制构造函数(你没有,那是一个赋值函数),那么你会得到一个默认的复制构造函数,它会逐位复制对象;那么你将有两个对象都指向同一个 data 数组,这最终会导致双重删除(或泄漏,如果没有删除数组。)
    • 抱歉没有解释,假设有析构函数和复制构造函数,我没有写它们,因为我只是想知道我的代码的这部分,但你说得对,我应该解释一下。
    猜你喜欢
    • 2017-07-09
    • 1970-01-01
    • 2012-04-26
    • 2011-08-05
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 2017-11-21
    • 2015-05-31
    相关资源
    最近更新 更多