2010-05-28 65 views
3

让我们来讨论这两个功能:函数应该返回引用还是对象?

  1. 复杂&操作者+ =(常量Ť& VAL);
  2. complex operator +(const T & val);

其中“复杂”是实现例如复杂变量的类的名称。因此,第一个操作符返回引用以便可以写出+ = b + = c(这相当于b = b + c; a = a + b;)。第二个操作符返回和对象(NOT A REFERENCE),我们仍然可以写a = b + c + d。

谁能解释我这个细微差别?返回引用或对象有什么区别?

回答

1

1,a + = b,+ =运算符修改a。因此,它可以返回对自身的引用,因为它本身是操作的正确结果。

然而,在一个新的对象是必需的,因为a + b返回的东西不是一个,所以返回一个参考将是不正确的。

4

赋值运算符支持多个应用程序相同的对象:

(a += b) += c; 

这都将bc添加到a。为此,a += b必须返回对a的引用。然而,加法运算符不要求这样,因为表达式b + c + d没有副作用。只有a的最终作业才有副作用。

1

从某种意义上说,您给出的例子就是细微之处。

从+运算符,你期望得到一个从你开始的两个不同的值:b + c既不是b也不是c,它是别的。因此,我们不能返回对b或c的引用,也没有在堆栈中分配新对象,这是我们必须使用的唯一两个对象。因此我们必须返回一个值。

而你已经解释了为什么+ =操作符返回它所做的事情。

0

在第一种情况下,您将向左侧的对象添加一些东西,但表达式的值是左侧的对象。所以你通过引用返回一些东西(通常是左边)。例如:

cout << (a+=b) 

在第二种情况下,所添加的两个对象和得到的第三个目的,并且可以执行堆栈上该计算,所以你是通过值而不是通过引用返回一个实际的对象。 例如:

if(...) 
{ 
    T a = b + c; 
    cout << a; 
} 
1

因为complex& operator+=(const T& val);运行在this因为complex operator+(const T& val);必须创建和新的临时对象。

如果您要从+=返回一个对象,它会可能做你的期望,但可能有一些额外的副本。正如你所提到的,如果你想连锁调用,你会想要这种行为。如果你返回了一个临时文件并且写了(a += b) += c,那么当你临时销毁它时,你的c将会丢失。

如果您要从+返回引用,那么您将引用一个临时对象,并且您的程序将具有未定义的行为。你可以写a=b+c+d,因为b+c创建了一个临时的b1b1 + d创建了一个临时的b2,然后将其分配给a

相关问题