[英]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.