我正在为 Vector 和 Matrices 编写一个类,我想了解当我想重载常见运算符(例如 +、-、* 和/)时如何避免开销和泄漏。
例如:
int main()
{
Vector3 aVector; //This has an address #1
Vector3 bVector; //This has another address #2
//rVector has an address #3
Vector3 rVector = aVector - bVector; //What will happen here?
}
和 vector 类:
class Vector3
{
public:
float vX, vY, vZ;
Vector3& operator-(const Vector3& vector3)
{
//I want to calculate this vector with the "vector3" param
//But then what do I return?
//Test 1:
Vector3 result; //This has an address #4
result.vX = vX - vector3.vX;
result.vY = vY - vector3.vY;
result.vZ = vZ - vector3.vZ;
return result; //Did I just overwrite address #3?
//Test 2:
vX = vX - vector3.vX;
vY = vY - vector3.vY;
vZ = vZ - vector3.vZ;
return (*this); //What happened to address #3? And I just changed this vector's values and I need then again later
}
}
执行此操作的最佳方法是什么?
编辑:还有一个问题,如果我想这样做:
Vector3 myVector = someVector - Vector3(x, y, z);
如何对构造函数进行编码,使其不做任何...不好的事情? 我想它会创建一个新类,但在上面的句子中使用它后我将无法引用它,这会导致以后出现问题吗?
最佳答案
您的实现没有任何泄漏。当超出函数范围时,您创建的每个 vector 都会被破坏。
关于返回值,建议按值返回(去掉&即可)。
关于你的第二个问题:这不是新的,所以没有泄漏。此外,您不需要引用它,因此没有真正的问题。
关于C++ 重载运算符并返回相同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18281178/