C++之過載運算子
阿新 • • 發佈:2018-11-12
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.過載運算子無法改變運算的優先順序