雙目運算子 過載為友元,單目運算子過載為 成員函式
一般格式
函式型別operator運算子名稱(形參表)
operator是關鍵字
例過載 + 號
#include using namespace std;
class complex;
complex::complex()
complex :: complex(double r, double i)
complex complex::operator+(complex &c2)
void complex::display()
int main ()
簡單寫法
complex complex :: operator+(complex &c2)
相當於
c1.operator + (c2);
如果寫為
c3 = 3 + c2; //錯誤
c3 = complex(3, 0) + c2; //正確
(1)c++不語序使用者自己定義新的運算子,只能對已有的c++運算子進行過載
(2)不能過載的運算子只有 5 個
.(成員訪問運算子)
*(成員指標訪問運算子)
::(域運算子)
sizeof
(長度運算子)
?:(條件運算子)
(3)過載不能改變運算子運算物件(即運算元)的個數(雙目運算子 單目運算子)
(4)過載不能改變運算子的優先級別。
(5)過載不能改變運算子的結合性(如 = 的左右)
(6)過載運算子的函式不能有預設的引數。
(7)過載運算子必須和使用者定義的定義型別物件一起使用,其引數至少應該有乙個是類物件。
int operator+(int a, int b)
//實際上是可以的 但是 這樣不遵守規則
但是可以寫複數和常數相加
complex complex :: operator+(double a)
complex :: operator+(double a, complex &c2)
(8)= 和 & 不用過載
(9)> 可以過載為 小於 但是 這樣違背了運算子過載的初衷,並且容易混淆
兩種處理方式(1)把運算過載函式作為類的成員函式
(2)運算子過載函式可以不是類的成員函式(普通函式),在類中把它宣告為友元函式。
class complex;
complex operator+(complex &c1, complex &c2)
相當於
operator + ( c1, c2 );
class complex;
complex::complex()
complex :: complex(double r, double i)
complex operator + (complex &c1, complex &c2)
complex operator + (complex &c1, double a)
complex operator + (double a, complex &c1)
(1)c++規定,賦值運算子=, 下標運算子 [ ],函式呼叫運算子 (),成員運算子 ->,必須作為成員函式
(2)插入流 << 和提取運算子 >> ,型別轉換運算子不能定義為類的成員函式。只能作為友元函式。
(3)一般將單目運算子和符合運算子(+= ,-= ,/=,*=,&=,!=,'=,%=,%=,>>=,<<=)過載為成員運算子
(4)一般雙目運算子過載為友元函式
#include#includeusing namespace std;
class string
string (char *str);
friend bool operator > (string &, string &);
friend bool operator < (string &, string &);
friend bool operator == (string &, string &);
void display();
private :
char *p;
};string :: string (char *str)
void string :: display()
bool operator > (string &str1, string &str2)
bool operator < (string &str1, string &str2)
bool operator == (string &str1, string &str2)
void compare (string &str1, string &str2)
else if(str1 < str2)
else
}int main ()
++i 和 i++
#includeusing namespace std;
class time;
time::time()
time :: time (int m, int s)
time time:: operator ++ ()
return *this;
}time time::operator ++(int)
return temp;
}void time::display()
int main()
istream & operator >> ( istream &, 自定義類 &)
ostream & operator << ( ostream &, 自定義類 & )
《有兩個引數,乙個是輸出流物件(我們常用的cout),還有就是要輸出的東西。
例如:cout<<"haha";
也就是說《的第乙個引數必須是輸出流物件。
在成員函式裡實現《過載,我們知道this會作為第乙個引數,而這是不符合要求的。
>>類似!
所以我們過載 " >> " 和 " << " 的函式只能作為友元函式,而不能將它們定義為成員函式。
#include using namespace std;
class complex;
complex:: complex()
complex :: complex (double r, double i)
complex complex::operator +(complex &c2)
ostream &operator <<(ostream &cout, complex &c)
int main ()
operator << ( cout , c3 );
#includeusing namespace std;
class complex;
ostream &operator << (ostream &cout, complex &c)
istream &operator >> (istream &cin, complex &c)
int main()
C 第4課 過載運算子
可以重定義或過載大部分 c 內建的運算子。這樣,就能使用自定義型別的運算子。過載的運算子是帶有特殊名稱的函式,函式名是由關鍵字 operator 和其後要過載的運算子符號構成的。與其他函式一樣,過載運算子有乙個返回型別和乙個引數列表。box operator const box box operat...
4 運算子過載
什麼是運算子過載 所謂過載,就是重新賦予新的含義。函式過載就是對乙個已有的函式賦予新的含義,使之實現新功能,因此,乙個函式名就可以用來代表不同功能的函式,也就是 一名多用 運算子也可以過載。1為什麼會用運算子過載機制 用複數類舉例 complex c3 c1 c2 原因 complex是使用者自定義...
C 基礎(4) 運算子過載
二.使用過載運算子 c 預定義中的運算子的操作物件只侷限於基本的內建資料型別,但是對於我們自定義的型別 類 是沒有辦法操作的。但是大多時候我們需要對我們定義的型別進行類似的運算,這個時候就需要我們對這麼運算子進行重新定義,賦予其新的功能,以滿足自身的需求。運算子過載的實質就是函式過載或函式多型。運算...