您是否应该 return 使用 operator+ 将两个 类 加在一起的引用?

Should you return a reference using operator+ for adding two classes together?

examples I have seen当人们使用operator+时添加一个class的两个实例时,通常的模式是return一个对象。假设我们有一个 Vector class 属性 uvoperator+ 的实现可能是

Vector2 Vector2::operator+(const Vector2& other) {
    return Vector2(this->u + other.u, this->v + other.v);
}

为什么标准模式不能return参考?这是 returning 一个在堆栈上创建的对象,这意味着它应该在我们离开该函数后进行垃圾回收,并且可能会导致之前指向它的问题。例如

Vector2 v = Vector(10,20) + Vector(30, 40),以后 v 会指向垃圾收集变量吗?因为 Vector(10, 20) + Vector(30, 40) 的结果是在堆栈上创建的(我们现在离开了)。

我的意思是,为什么这不应该是这样的,

Vector2* Vector2::operator+(const Vector2& other) {
    return new Vector2(this->u + other.u, this->v + other.v);
}

Should you return a reference using operator+ for adding two classes together?

没有

Why is the standard pattern not to return a reference?

因为二元+运算符按惯例returns一个新对象。

Vector2 v = Vector(10,20) + Vector(30, 40), would v later be pointing to a garbage collected variable?

没有。 C++没有垃圾收集器,Vector2大概不是指针。

What I am saying is, why should this not be something like,

Vector2* Vector2::operator+(const Vector2& other) {
    return new Vector2(this->u + other.u, this->v + other.v);
}

因为:

  1. 使用裸指针是一个可怕的想法。
  2. 返回空指针让这个想法变得更糟。
  3. 将抽象操作表示为基本操作(例如,本例中的加法)的运算符重载应符合与基本操作相同的接口和行为。
    • 1 + 1的类型不是int*,所以vector + vector的类型不应该是Vector2*
    • 不需要 delete 1 + 1 的结果,因此不需要 delete vector + vector 的结果。