[英]C++ overloading operators and returning same object
我正在为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?
}
和向量类:
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);
我该如何对构造函数进行编码,使其不执行任何操作……不好? 我以为它将创建一个新类,但是在上面的句子中使用它后,我将没有任何方法可以引用它,这以后会导致问题吗?
您的实现没有任何泄漏。 超出函数范围时,创建的每个向量都会被破坏。
至于返回值,建议您按值返回(只需删除&即可)。
关于第二个问题:这不是新产品,所以没有泄漏。 另外,您不需要引用它,因此没有实际问题。
创建operator-
作为名称空间作用域函数(而不是成员函数):
Vector3 operator-(const Vector3 &lhs, const Vector3 &rhs)
{
Vector3 result{lhs};
// Subtract out rhs
...
// Do the math
return result;
}
在任何情况下都不会泄漏任何内容,因为您还没有从堆中分配任何东西(免费存储)。
测试1将答案存储在新的向量(结果)中,并假设将其返回作为对rVector的引用。
rVector = result
aVector = //its original value
测试2将答案存储在调用了函数(aVector)的向量中,并将其返回作为对rVector的引用。
rVector = aVector
aVector = //the answer
尽管使用测试2将节省内存,但答案存储在函数外部的两个位置(rVector和aVector),这可能不是您想要的。 测试1是更安全的选择,但请确保按值返回它,以避免此处其他人指出的范围外错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.