運算子過載

2023-01-19 20:39:02 字數 1751 閱讀 2554

一、 運算子過載的概念

運算子過載允許把標準運算子重定義,使之對指定型別的物件執行指定的操作。

注意:1 一般地,運算子過載函式由關鍵字operator和要過載的運算子組成,對於用字母表示的運算子,例如new和delete,在關鍵字和運算子之間至少有乙個空格。對於其它運算子,空格可選。

2 過載運算子不准發明新的運算子,不能修改原運算子的優先順序、結合性和運算元個數。

3 運算子函式既可以實現為類的成員函式,也可實現為一般全域性函式。

二.運算子函式的一般形式

二元運算子函式作為成員函式的一般形式為:

返回值型別 operator x(型別右運算元){

左運算元預設為呼叫者,也就是this指標預設包含左運算元的位址。

二元運算子函式作為一般全域性函式的一般形式為:

返回值型別 operator x(型別左運算元,型別右運算元){

一元運算子函式作為成員函式,一般不需要引數,但遞增遞減運算子例外。一般形式為:

型別& operator x();

一元運算子函式作為一般全域性函式,只有乙個引數,形式為:

型別& operator x(型別&);

注意:無論把運算子函式作為成員函式或者一般全域性函式,它的運算元個數都是原規定的個數。

三、 賦值運算子函式

賦值運算子函式是唯一乙個具有預設版本的運算子。如果未定義賦值運算子函式,編譯

器就會使用預設賦值運算子函式 operator=()。

副本建構函式和賦值運算子函式功能接近,但呼叫場合不同。副本建構函式是在用類的乙個已有物件初始化另乙個物件時,或按值傳送給函式時呼叫;而賦值運算子函式是在賦值語句的左右兩邊是同乙個類的物件時,才會呼叫。

賦值運算子函式的返回值型別根據情況指定為一般類型別或引用類型別。

四、 下標運算子函式

下標運算子也是二元運算子。我們可以這樣理解,根據使用形式:

陣列名.[下標]

把陣列看作是左運算元,下標看作是右運算元。

注意:不要把下標運算子與陣列識別符號混淆。下標運算子是在引用元素時的「」,而陣列識別符號是在定義(宣告)陣列時的「」。

五、 過載型別轉換

可以定義個運算子函式,把類型別轉換為其它型別。要轉換成的型別可以是基本型別或

類型別。轉換任意類的運算子函式形式為:

class t{

public:

operator typetype是要轉換成的型別

注意:1 不能指定返回值型別,因為返回值型別就是要轉換成的型別type,為該函式指定返回值型別是錯誤的。

2 當在賦值語句中隱式轉換,或在語句中用資料型別顯式轉換時,會呼叫型別轉換函式。

六、 過載遞增遞減運算子

由於遞增遞減運算子有字首和字尾兩種形式,所以要分別定義它們。對任意類t,它的

++函式宣告為:

class t{

public:

t& operator++();

const t operator++(int);

說明:1 對於字首形式,返回值應該是乙個引用,因為要直接對變數進行修改;對於字尾形式,返回值是該型別的const物件。

2 字尾形式中的int型別形參只是用來在呼叫時區別字首字尾兩種形式,沒有其它任何實際用途。

總結:運算子過載說得很簡約,是因為具體的函式定義要根據類的情況來決定。這裡只能提個大概。順便說一下,有五個運算子不能過載,它們是:

另外,不能過載預處理命令識別符號#和標識傳送符號##。

一元運算子函式的this更加簡單,它總是指向唯一的那個「運算元」!把該運算元當成是呼叫者。

Student類 友元,運算子過載,繼承 綜合題

void display輸出函式 void input輸入函式 void min student int 求最低成績函式 void sort student int 按照成績高低排序函式 protected這裡是保護成員 這裡是vc6.0的原因 string num 學號 string name 姓...

移位運算子詳解

移位運算子就是在二進位制的基礎上對數字進行平移。按照平移的方向和填充數字的規則分為三種 左移 帶符號右移 和 無符號右移 在移位運算時,byte short和char型別移位後的結果會變成int型別,對於byte short char和int進行移位時,規定實際移動的次數是移動次數和32的餘數,也就...

Java位運算子詳解

按位與運算子 參加運算的兩個資料,按二進位制位進行 與 運算。運算規則 0 0 0 0 1 0 1 0 0 1 1 1 即 兩位同時為 1 結果才為 1 否則為0 例如 3 5 即 0000 0011 0000 0101 0000 0001 因此,3 5的值得1。另,負數按補碼形式參加按位與運算。與...