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 不能加上 &
沒有留言:
張貼留言