網頁

2015年1月6日 星期二

C++ - Operator with reference(&)

Last Update: 2015/01/07 10:56+08
Type: Note



Intro

最近都在玩 pointer(*) 和 reference(&)
這次這篇主要是要探討 operator 與 reference(&) 的關係
之前提到 C++ &(and) 與 const 的關係
其中有一個 用 reference(&) 的方式 作為 function return, 有些人提到這是個 evil 作法
無論如何, 它也是個有用的東西, 只是要注意使用



Content

class Vec2D {
public:
 Vec2D() {
  this->x = 0;
  this->y = 0;
 }
 Vec2D(int x, int y) {
  this->x = x;
  this->y = y;
 }
public:
 int x, y;
};
2D向量 a 和 b



Case: a = b;
我的"operator =" 應該怎麼寫?
建議寫法
Vec2D& operator=(const Vec2D &rhs) {
 this->x = rhs.x;
 this->y = rhs.y;
 return *this;
}
因為 右式 不會改變, 所以 argument rhs 用 const + & 最有效率
若你回傳的是function內部變數的參考位置, return 用 & 是會有遺失參考的可能性, 但是在這邊不是
而且 使用 "operator =" 時, 代表 原來呼叫這個物件的對象 也應該要有這個物件的位置, 所以不會遺失
因此, 用 reference(&) 速度較快, 你可以執行 for loop a = b; 計時比較看看

我可以這樣寫嗎?
Vec2D operator=(const Vec2D &rhs) {
 Vec2D v;
 v.x = rhs.x;
 v.y = rhs.y;
 return v;
}
NO, 這會與預期的結果不同, 而且速度更慢
"operator=" 形同一個function
當你執行 "a = b" 時, 等同執行 "a.operator=(b)"
它的回傳值並不會改變 a

"operator+=" 類似
Vec2D& operator+=(const Vec2D &rhs) {
 this->x += rhs.x;
 this->y += rhs.y;
 return *this;
}



Case: c = a + b;
建議寫法
Vec2D operator+(const Vec2D& rhs) const {
 Vec2D lhs;
 lhs.x = this->x + rhs.x;
 lhs.y = this->y + rhs.y;
 return lhs;
}
同樣, 參數不會被改變 const + & 較有效率
function 後面加上 const, 說明此function不會改寫原物件
一樣將它視為一個普通的function: "c = a.operator+(b)"
a,b 都不會被改變, 我們需要一個新的內部變數來計算, 但不能回傳其參考
所以return 不能加上 &



沒有留言:

張貼留言