运算符重载导致错误结果
我有一个 Vector3 类,它的 + 和 * 运算符重载如下:
Vector3& operator+ (Vector3& v1, Vector3& v2)
{
Vector3 sum = Vector3(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
static Vector3& ref = sum;
return ref;
}
Vector3& operator* (Vector3& v1, double value)
{
Vector3 product = Vector3(v1.x * value, v1.y * value, v1.z * value);
static Vector3& ref = product;
return ref;
}
Vector3& operator* (double value, Vector3& v1)
{
Vector3 product = Vector3(v1.x * value, v1.y * value, v1.z * value);
static Vector3& ref = product;
return ref;
}
但是,当计算 2 个向量 v1 和 v2 的线性组合时,单独完成与在一行中完成时,我会得到 2 个不同的结果:
#include <iostream>
#include "Vector3.h"
using namespace std;
int main()
{
Vector3 v1 = Vector3(1.0, 2.0, 3.0);
Vector3 v2 = Vector3(2, 2, 2);
Vector3 v3 = v1 * -1;
Vector3 v4 = v2 * 1.2;
cout << v3 + v4 << endl;
cout << (v1 * -1.0) + (v2 * 1.2) << endl;
return 0;
}
输出:
(1.4, 0.4, -0.6)
(-2, -4, -6)
回答
您的代码具有未定义的行为,一切皆有可能。参考ref和返回的引用是指本地对象sum和product,当得到的功能了,离开了返回的引用晃来晃去,这将被销毁。对它们的取消引用导致 UB。
operator+并且operator*应该按值返回。
Vector3 operator+ (const Vector3& v1, const Vector3& v2)
{
return Vector3(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
}
Vector3 operator* (const Vector3& v1, double value)
{
return Vector3(v1.x * value, v1.y * value, v1.z * value);
}
Vector3 operator* (double value, const Vector3& v1)
{
return Vector3(v1.x * value, v1.y * value, v1.z * value);
// or
// return v1 * value;
}
顺便说一句:我更改了Vector3作为参考的运算符const,它也适用于临时变量。
- @StealthyPanda 很可能是因为您的运算符版本通过非常量引用获取参数,这也是错误的。