我正在編寫一個Vector和矩陣的類,我想知道如何避免開銷和泄漏當我想重載常見的操作符如+, - ,*和/ 。C++重載操作符並返回相同的對象
例如:
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);
如何編寫構造,因此不會做任何事情......不好? 我在想它會創建一個新班級,但在上面的句子中使用它之後,我不會有任何方法來引用它,這會導致以後出現問題嗎?
'operator-'應該按值返回。在這裏返回一個參考是沒有意義的。 – juanchopanza
只是爲了展開@juanchopanza,在這裏返回引用是返回一個超出範圍對象的引用。就像返回一個指向超範圍對象的指針一樣:你會打破某些東西。在這裏返回值。回報應該被消除,所以不要虛報(太多)關於僞造的副本。如果你真的很擔心,你可以製作構建器和作業,完成! – IdeaHat
通常,'operator +'和'operator-'按值返回。但是,'operator + ='和'operator- ='通常會按照引用返回。 – Xaqq