2013-05-30 67 views
0

我试图了解在此代码中返回引用的目的是什么?仅仅是因为返回引用比复制要快得多,还是有其他更重要的东西?参考返回赋值运算符

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; 
} 

回答

0

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

+0

感谢您的relpy,但我Coult了解您的答案的一部分。“默认复制此类的实例将导致多个实例共享相同的数据成员,并且可能会导致多次删除。我的意思是如果我不能写&那里,当我删除c对象中的部分数据时,它也通过b和一个对象删除? –

+0

如果你用一个指向已分配内存的成员编写一个类,则必须小心指针永远不会泄漏或被双重删除。通常这意味着您需要定义析构函数和复制构造函数以及operator =()。如果你没有定义一个拷贝构造函数(你不这样做,那是一个赋值函数),那么你会得到一个默认拷贝构造函数,它可以逐位拷贝对象;那么你会有两个对象都指向相同的'数据'数组,最终会导致双重删除(或者泄漏,如果没有删除数组)。 –

+0

抱歉错误的解释假设有析构函数和复制构造函数,我没有写他们,因为我只是想知道我的代码的这部分,但你说得对,我应该解释这一点。 –

0

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

在C++ 11之前,返回值而不是引用会导致副本开销。

+0

在此处返回值必须在C++ 11或更早版本中返回副本。你不能隐式地从'* this'移动,或者不能复制副本。 –