c++ 過載運算子和過載函式
c++ 允許在同一作用域中的某個函式和運算子指定多個定義,分別稱為函式過載和運算子過載。
過載宣告是指乙個與之前已經在該作用域內宣告過的函式或方法具有相同名稱的宣告,但是它們的引數列表和定義(實現)不相同。
當您呼叫乙個過載函式或過載運算子時,編譯器通過把您所使用的引數型別與定義中的引數型別進行比較,決定選用最合適的定義。選擇最合適的過載函式或過載運算子的過程,稱為過載決策。
c++ 中的函式過載
在同乙個作用域內,可以宣告幾個功能類似的同名函式,但是這些同名函式的形式引數(指引數的個數、型別或者順序)必須不同。您不能僅通過返回型別的不同來過載函式。
下面的例項中,同名函式 print() 被用於輸出不同的資料型別:
例項
#include
using
namespace std;
class
printdata
void
print
(double f)
void
print
(char c)
};intmain
(void
)
當上面的**被編譯和執行時,它會產生下列結果:
整數為: 5
浮點數為: 500.263
字串為: hello c++
c++ 中的運算子過載
您可以重定義或過載大部分 c++ 內建的運算子。這樣,您就能使用自定義型別的運算子。
過載的運算子是帶有特殊名稱的函式,函式名是由關鍵字 operator 和其後要過載的運算子符號構成的。與其他函式一樣,過載運算子有乙個返回型別和乙個引數列表。
box operator+(const box&);
宣告加法運算子用於把兩個 box 物件相加,返回最終的 box 物件。大多數的過載運算子可被定義為普通的非成員函式或者被定義為類成員函式。如果我們定義上面的函式為類的非成員函式,那麼我們需要為每次操作傳遞兩個引數,如下所示:
box operator+(const box&, const box&);
下面的例項使用成員函式演示了運算子過載的概念。在這裡,物件作為引數進行傳遞,物件的屬性使用 this 運算子進行訪問,如下所示:
例項
#include
using
namespace std;
class
boxvoid
setlength
(double len )
void
setbreadth
(double bre )
void
setheight
(double hei )
// 過載 + 運算子,用於把兩個 box 物件相加
box operator+(
const box& b)
private
:double length;
// 長度
double breadth;
// 寬度
double height;
// 高度};
// 程式的主函式
intmain()
當上面的**被編譯和執行時,它會產生下列結果:
volume of box1 : 210
volume of box2 : 1560
volume of box3 : 5400
可過載運算子/不可過載運算子
下面是可過載的運算子列表:
雙目算術運算子 + (加),-(減),(乘),/(除),% (取模)
關係運算子 ==(等於),!= (不等於),< (小於),> (大於》,<=(小於等於),>=(大於等於)
邏輯運算子 ||(邏輯或),&&(邏輯與),!(邏輯非)
單目運算子 + (正),-(負),(指標),&(取位址)
自增自減運算子 ++(自增),–(自減)
位運算子 | (按位或),& (按位與),~(按位取反),^(按位異或),,<< (左移),>>(右移)
賦值運算子 =, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>=
空間申請與釋放 new, delete, new[ ] , delete
其他運算子 ()(函式呼叫),->(成員訪問),,(逗號),
下面是不可過載的運算子列表:
.:成員訪問運算子
., ->:成員指標訪問運算子
:::域運算子
sizeof:長度運算子
?::條件運算子
#: 預處理符號
C 運算子過載 過載特殊運算子
賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...
C 運算子過載賦值運算子
自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...
C 運算子過載轉換運算子
為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...