您是否应该 return 使用 operator+ 将两个 类 加在一起的引用?
Should you return a reference using operator+ for adding two classes together?
从examples I have seen当人们使用operator+
时添加一个class的两个实例时,通常的模式是return一个对象。假设我们有一个 Vector
class 属性 u
和 v
,operator+
的实现可能是
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 + 1
的类型不是int*
,所以vector + vector
的类型不应该是Vector2*
。
- 不需要
delete
1 + 1
的结果,因此不需要 delete
vector + vector
的结果。
从examples I have seen当人们使用operator+
时添加一个class的两个实例时,通常的模式是return一个对象。假设我们有一个 Vector
class 属性 u
和 v
,operator+
的实现可能是
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 + 1
的类型不是int*
,所以vector + vector
的类型不应该是Vector2*
。- 不需要
delete
1 + 1
的结果,因此不需要delete
vector + vector
的结果。