C 第4章 (運算子的過載)

2021-09-05 12:42:27 字數 4027 閱讀 4839

運算子的過載實質是函式的過載

雙目運算子 過載為友元,單目運算子過載為 成員函式

一般格式

函式型別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 預定義中的運算子的操作物件只侷限於基本的內建資料型別,但是對於我們自定義的型別 類 是沒有辦法操作的。但是大多時候我們需要對我們定義的型別進行類似的運算,這個時候就需要我們對這麼運算子進行重新定義,賦予其新的功能,以滿足自身的需求。運算子過載的實質就是函式過載或函式多型。運算...