1. 程式人生 > >C++之過載運算子

C++之過載運算子

C++過載運算子


過載運算子
C++中很多內建資料型別都支援如"+"、"-"、"="、"<"等運算子,這使得表示式非常的簡潔。但很多情況下,我們也希望自已定義的一些資料結構也支援類似的運算子。C++提供了這樣一種機制,支援我們在不同的資料型別下對運算子進行過載,於是我們可以讓自己定義的資料型別同樣支援運算子。下面列出 C++支援過載的運算子

型別 運算子
雙目算術運算子 +(加) 、-(減)、* 、/ 、%
單目運算子 + (正)、-(負)、*(指標) 、&(取址)
關係運算符 >、<、>=、<=、==、!=
邏輯運算子 | |、&&、!
位運算子 &、|、^、~、<<、>>
賦值運算子 =、+=、-=、*=、=、%=、&=、|=、^=、<<=、>>=
其他運算子 ++、–、[]、,(逗號)、->、()(函式)、new、delete、new[]、delete[]、<<(流)、>>

不可過載的運算子:
1.成員訪問運算子(.)
2.成員指標訪問運算子(.*和->* ),
3.域運算子(::)、
4.長度運算子(sizeof)、
5.條件運算子(?:)、
6.預處理符號(#)

下面看一個簡單的例子:

#include <iostream>
using namespace std;
struct Point {
public:
	int x, y;
	Point(int a, int b) :x(a), y(b) {};
	Point(int a) :x(a), y(a) {};
};
Point operator+(const
Point& A, const Point& B) { return Point(A.x + B.x, A.y + B.y); } int main() { Point p1(2, 2); Point p2(3, 4); Point p3 = p1 + p2; cout << p3.x << " " << p3.y << endl; return 0; }

例中,為Point結構體過載了"+“運算子,傳入的引數是要求和的兩個結構體,返回一個新的結構體,它的x和y值是傳入的兩個結構體的對應值之和。過載了”+"運算子之後就可以通過"p1+p2"的形式對兩個結構體求和了。

在上面例子的基礎上再對"<<“流運算子進行過載,使Point支援”<<"操作。

#include <iostream>
using namespace std;
struct Point {
public:
	int x, y;
	Point(int a, int b) :x(a), y(b) {};
	Point(int a) :x(a), y(a) {};
};
Point operator+(const Point& A, const Point& B) {
	return Point(A.x + B.x, A.y + B.y);
}
ostream& operator<<(ostream& out, const Point& B) {	
	out << "(" << B.x << ", " << B.y << ")";
	return out;
}
int main() {
	Point p1(2, 2);
	Point p2(3, 4);
	Point p3 = p1 + p2;
	cout << p3 << endl;
	return 0;
}

這裡對"<<“運算子進行了過載,函式的第一個引數型別是ostream的引用,表示輸出流,第二個引數型別是結構體Point的引用,在函式中將Point的變數按照自定義的規則流入到第一個引數所引用的ostream中,然後返回所引用的ostream。過載了”<<“運算子後,Point就可以通過”<<"運算子輸出以自定義的格式輸出到標準輸出了。

過載"-“和”<"運算子:

#include <iostream>
using namespace std;
struct Point {
public:
	int x, y;
	Point(int a, int b) :x(a), y(b) {};
	Point(int a) :x(a), y(a) {};
};
Point operator+(const Point& A, const Point& B) {//加
	return Point(A.x + B.x, A.y + B.y);
}
Point operator-(const Point &A) {//負
	return Point(-A.x, -A.y);
}
ostream& operator<<(ostream& out, const Point& B) {//流
	out << "(" << B.x << ", " << B.y << ")";
	return out;
}
bool operator<(const Point& A, const Point& B) {//小於
	return A.x < B.y;
}
int main() {
	Point p1(2, 2);
	Point p2(3, 4);
	Point p3 = p1 + p2;//(5, 6)
	Point p4 = -p3;	   //(-5, -6)
	cout << p3 << " " << p4 << " " << (p1 < p2) << endl;
	return 0;
}

例子中對-(取負)、<(小於)進行了過載,因此可以直接對用-Point格式對Point取負,用Point1<Point2對兩個結構體進行比較。這裡的<(小於)運算子在一些STL中的演算法中是很有用的。

注意事項
1.過載運算子無法改變運算子的原有結構形式
2.過載運算子不能改變運算元的個數
3.過載運算子無法改變運算的優先順序