0

以这两个前面的线程为例

第一个线程: 为什么重载的赋值运算符返回对类的引用?

第二个线程: 为什么复制赋值运算符必须返回一个引用/常量引用?

重载赋值运算符的返回类型是类还是对类的引用?我都见过:

Point& Point::operator = (const Point& sourcePoint)
{
// As in the first thread I pasted above
return *this;
}

Point Point::operator = (const Point& sourcePoint)
{
// As in the second thread I pasted above
return *this;
}

哪个是对的?

同样,有什么区别:

int exFunction()
{
     int i = 5;
     int* iPtr = &i;
     return *iPtr;
}

相对:

int& exFunction2()
{
     int j = 5;
     int* jPtr = &j;
     return *jPtr;
}

谢谢!

4

1 回答 1

1

这两件事根本不“相似”。

首先,赋值运算符。它们应该返回对对象本身的引用,以便您可以在链中使用它们:

Foo x, y, z;

x = y = z;   // makes y equal to z and returns a reference to self,
             // which is assigned to x

所以总是这样:

Foo & operator=(Foo const &) { /* ... */  return this; }  // copy-assignment

Foo & operator=(/* any other signature */) { /* ... */   return this; }

现在,第二个问题:你exFunction2是完全错误和破碎的。它具有未定义的行为,因为它返回对局部变量的引用,该引用在函数返回时超出范围。(它本质上说return j;; 记住取消引用的结果是一个左值。)编写该函数的唯一明智的方法是 like exFunction,可以缩短为int exFunction() { return 5; }.

这是有关此主题的相关问题。

于 2012-10-25T23:13:14.537 回答