當你編寫操作符時,有幾件事情需要知道,這些操作符並不經常與其他函數一起使用。
的分配運營商,例如,將返回*這一點,因爲你改變了矢量值:
class v {
public:
double x_, y_;
v& operator += (const v& rhs)
{
_x += rhs._x;
_y += rhs._y;
return *this;
}
};
另一個有趣的一個,前++,後++是不同的未使用的僅僅是因爲參數:
class v {
public:
double x_, y_;
v& operator ++(); // ++v
v& operator ++ (int); // v++
};
「等於」(賦值)是另一個當你使用指針時很棘手。對於一個矢量,它通常不會是一個問題,但如果你定義一個矢量V,並將其分配給自己,你必須要小心:
class v {
public:
double x_, y_;
v& operator = (const v& rhs)
{
if(this != &rhs)
{
x_ = rhs.x_;
y_ = rhs.y_;
}
}
};
在你的情況下,如果()肯定會沒有用處,但是想想做這樣的事情:
delete p_;
p_ = new foo;
p_->x_ = rhs.p_->x_;
如果& RHS ==這一點,那麼delete p_
刪除RHS指針!這意味着在第三行訪問它是一個錯誤。
其餘的應該很容易處理。比較運算符返回布爾並常量:
class v {
public:
double x_, y_;
bool operator == (const v& rhs) const
{
return x_ == rhs.x_ && y_ == rhs.y_;
}
};
除[]操作符。有兩種版本:
class v {
public:
// I would imagine you'd use an array but as a simple example...
double x_, y_;
double operator [] (int idx) const
{
return idx == 0 ? x_ : y_;
}
v_ref operator [] (int idx)
{
v_ref v(this, idx);
return r;
}
};
正如您所看到的,[]運算符的非常量版本返回一個引用。這是必要的,所以你可以寫這樣的東西:
r[3] = 7.3;
r [3]返回該引用,然後用7.3調用引用的分配作爲參數。
class v_ref
{
public:
v *p_;
int i_;
v_ref(v *p, int i)
: p_(p), i_(i)
{
}
operator = (double q)
{
// again, I suppose you'd use an array instead!
if(i_ == 0)
{
p_->x_ = q;
}
else
{
p_->y_ = q;
}
}
};
假設你想要一些安全性,矢量指針可以利用一個引用計數器,所以你知道,如果一個主矢量對象獲得其所有的參考對象之前刪除...
另注:我會假設你的構造函數將分配一個double數組(或者使用std :: vector類型......)如果你使用new,記得要在析構函數中刪除,這就是賦值運算符中的if()非常重要。
當你說「數學矢量」時,它的實際類型是什麼? –
是否這樣? http://www.cplusplus.com/doc/tutorial/classes2/ – JustinDanielson
在uni的未來工作中,我被告知我們將使用「數學向量,而不是STL向量」,因此不確定它們是相同的還是不同的。 – SharpCode