在C++中从函数返回局部变量?

3
这是从一篇C++教程中摘录的:

链接到C++教程之一

// vectors: overloading operators example
#include <iostream>
using namespace std;

class CVector {
  public:
    int x,y;
    CVector () {};
    CVector (int,int);
    CVector operator + (CVector);
};

CVector::CVector (int a, int b) {
  x = a;
  y = b;
}

CVector CVector::operator+ (CVector param) {
  CVector temp;
  temp.x = x + param.x;
  temp.y = y + param.y;
  return (temp);
}

int main () {
  CVector a (3,1);
  CVector b (1,2);
  CVector c;
  c = a + b;
  cout << c.x << "," << c.y;
  return 0;
}

在运算符重载函数中,它创建了一个名为temp的局部变量,然后返回它。我很困惑,这是正确的方式吗?

3
如果你解释清楚你的困惑,我们可以给出比“是”更有意义的回答。 - interjay
如果不考虑 operator+ 通常是通过 operator+= 实现的事实。 - chris
return (temp) 中的括号是必需的吗? - qed
@qed 不,它们是不必要的噪音。 - BartoszKP
2个回答

5

"这是正确的方法吗?"

是的。请注意,返回的不是局部变量本身,而是局部变量的副本,这是完全有效和正确的做法。在通过指针或引用返回时,请注意不要返回局部变量,而是通过值返回


也许这样的操作可能会导致未定义的行为。例如,如果类在构造函数中分配了某个字符串的指针,并且它只有默认的复制构造函数。 - Michael
@Michael:然而这不是这种情况,也与此事无关。 - LihO
好的。那么在这里使用以下链接描述的类就可以了:https://dev59.com/QHA75IYBdhLWcg3weY5f? - Michael

1

是的,因为它是按值返回的。如果函数的签名如下,则不正确:

CVector& CVector::operator+(CVector param);

顺便说一句,更高效的实现方法如下:

CVector CVector::operator+(const CVector &param) const;

简而言之,按引用传递,按值返回。 - qed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接