【问题标题】:Function should return reference or object?函数应该返回引用还是对象?
【发布时间】:2011-02-25 02:27:34
【问题描述】:
让我们讨论这两个函数:
-
complex& operator+=(const T& val);
-
复数 operator+(const T& val);
其中“complex”是实现复杂变量的类的名称。
所以第一个操作符返回引用以便可以写成a+=b+=c(相当于b=b+c; a=a+b;)。
第二个运算符返回和objec(NOT A REFERENCE),我们还能写a=b+c+d吗?
谁能解释我这个细微差别?返回引用和对象有什么区别?
【问题讨论】:
标签:
c++
reference
operators
operator-overloading
【解决方案1】:
赋值运算符支持对同一个对象的多次应用:
(a += b) += c;
这会将b 和c 添加到a。为此,a += b 必须返回对a 的引用。但是,加法运算符不需要这样做,因为表达式 b + c + d 没有副作用。只有对a 的最终分配有副作用。
【解决方案2】:
在 1,a+=b 中,+= 操作符修饰 a。因此它可以返回对自身的引用,因为 a 本身就是操作的正确结果。
但是,在 2. 中需要一个新对象,因为 a+b 返回的东西不是 a,因此返回对 a 的引用是不正确的。
【解决方案3】:
在某种程度上,细微差别就在你给出的例子中。
您希望从 + 运算符返回与您开始时的两个不同的值:b+c 既不是 b 也不是 c,它是别的东西。因此,我们不能返回对 b 或 c ... 的引用,也不能在堆栈上分配一个新对象,这将是我们唯一需要使用的两个。因此我们必须返回一个值。
您已经解释了为什么 += 运算符返回它的作用。
【解决方案4】:
因为complex& operator+=(const T& val); 对this 进行操作,并且因为complex operator+(const T& val); 必须为总和创建一个新的临时对象。
如果您要从 += 返回一个对象,它可能会按照您的预期进行,但其中可能会有一些额外的副本。正如您所提到的,如果您想要链接调用,您会想要这种行为。如果您返回了一个临时的并写了(a += b) += c,那么您添加的c 将在临时销毁时丢失。
如果您要返回来自+ 的引用,您将获得对临时的引用,并且您的程序将具有未定义的行为。你可以写a=b+c+d,因为b+c会创建一个临时的b1,而b1 + d会创建一个临时的b2,然后分配给a。
【解决方案5】:
在第一种情况下,您正在向左侧的对象添加一些内容,但表达式的值是左侧的对象。所以你通过引用返回一些东西(通常是左边)。例如:
cout << (a+=b)
在第二种情况下,您添加了两个对象并获得了第三个对象,并且您可以在堆栈上进行此计算,因此您通过值而不是通过引用返回一个实际对象。
例如:
if(...)
{
T a = b + c;
cout << a;
}