Point2D p1(10, 10);
Point2D p2;
p2 = p1 + 10;
Point2D p2;
p2 = p1 + 10;
但是使用類別成員重載,您就無法使用這個方法讓運算子重載有以下的功能:
Point2D p1(10, 10);
Point2D p2;
p2 = 1 + p1;
Point2D p2;
p2 = 1 + p1;
您可以規避這個問題,但每次都要讓其它型態的運算元置於運算子右邊也是蠻麻煩的,而且有時會容易出錯,這時您可以使用friend函式來重載運算子,使用 friend函式重載二元運算子時,您要指定兩個參數型態,分別表式運算子左右邊的運算元型態,您可以藉由安排這兩個參數來解決以上的問題,例如先如下定 義Point2D.h:
class Point2D {
public:
....
friend Point2D operator+(const Point2D&, int); // 例如p+10
friend Point2D operator+(int, const Point2D&); // 例如10+p
private:
int _x;
int _y;
};
public:
....
friend Point2D operator+(const Point2D&, int); // 例如p+10
friend Point2D operator+(int, const Point2D&); // 例如10+p
private:
int _x;
int _y;
};
再實作Ball.cpp:
#include "Point2D.h"
....
Point2D operator+(const Point2D &p, int i) {
Point2D tmp(p._x + i, p._y + i);
return tmp;
}
Point2D operator+(int i, const Point2D &p) {
Point2D tmp(i + p._x, i + p._y);
return tmp;
}
....
Point2D operator+(const Point2D &p, int i) {
Point2D tmp(p._x + i, p._y + i);
return tmp;
}
Point2D operator+(int i, const Point2D &p) {
Point2D tmp(i + p._x, i + p._y);
return tmp;
}
接著您就可以直接如下進行運算:
Point2D p1(5, 5);
Point2D p2;
p2 = 10 + p1;
Point2D p2;
p2 = 10 + p1;
您也可以使用friend函式來重載++或--這類的一元運算子,但要注意的是,friend不會有this指標,所以為了讓它具有++或--的遞增遞減 原意,您要使用傳參考的方式,將物件的位址告訴函式,例如:
class Point2D {
public:
....
friend Point2D operator++(Point2D&); // 前置
friend Point2D operator++(Point2D&, int); // 後置
private:
int _x;
int _y;
};
public:
....
friend Point2D operator++(Point2D&); // 前置
friend Point2D operator++(Point2D&, int); // 後置
private:
int _x;
int _y;
};
實作時如下:
#include "Point2D.h"
....
....
Point2D operator++(Point2D &p) {
p._x++;
p._y++;
return p;
}
Point2D operator++(Point2D &p, int) {
Point2D tmp(p._x, p._y);
p._x++;
p._y++;
return tmp;
}
p._x++;
p._y++;
return p;
}
Point2D operator++(Point2D &p, int) {
Point2D tmp(p._x, p._y);
p._x++;
p._y++;
return tmp;
}
沒有留言:
張貼留言