參考:前言:
運算子過載和函式過載體現了物件導向技術的多型性。多型性機制不僅增加了物件導向軟體系統的靈活性,進一步減少了冗餘資訊,而且顯著提高了軟體的可重用性和可擴充性。
從實現的角度來講,多型性可以劃分為兩類:編譯時的多型性和執行時的多型性。在c++語言中,編譯時的多型性主要是通過函式過載和運算子過載實現的。
本文主要講的是編譯時多型,因為編譯時多型主要是通過函式過載和運算子過載實現的。
執行時多型之後再講。
c++允許在同一作用域中的某個函式和運算子指定多個定義,分別稱為函式過載和運算子過載。
一、c++ 中的函式過載
概念原理
重新命名機制(name mangling):
編譯器根據函式不同的參數列,對同名函式的名稱進行函式修飾,從而這些同名函式就成為了不同的函式(至少對於編譯器來說是這樣的)。該過程在編譯器間就已經確定了,也就是說在編譯期就繫結了(早繫結)。
區分c語言是不支援函式過載的,這裡涉及另外乙個知識點:c++在相容c時的extern "c"的用法。
**例項
#include
using namespace std;
void
print
(int i)
void
print
(string str)
intmain()
二、c++ 中的運算子過載
2.0 使用全域性函式進行運算子過載(資料成員為public屬性)
c++就為運算子過載提供了一種方法,即運算子過載函式。其函式名字規定為operator後緊跟過載運算子。比如:operator+(),operator*()等。現在我們給出乙個加法運算子的過載函式用於完成複數的加法運算:
#include
using namespace std;
class complex //複數類};
complex operator+
(complex com1,complex com2)
//運算子過載函式
intmain()
輸出:
sum的實數部分為: 30
sum的虛數部分為: 30i
上述示例中的運算子過載函式是不屬於任何的類,是全域性的函式。因為在complex類(複數類)中的資料成員是公有的性質,所以運算子過載函式可以訪問。但如果定義為私有的呢,那該怎麼辦。其實,在實際的運算子過載函式宣告當中,有兩種方法:
定義其為要操作類的成員函式或類的友元函式。
2.1 運算子過載函式作為類的友元函式的形式:
友元函式過載雙目運算子(有兩個運算元,通常在運算子的左右兩則),參數列中的個數為兩個。若是過載單目運算子(只有乙個運算元),則參數列中只有一引數。
class 類名
類外定義格式:
返回型別 operator運算子(參數列)
1) 友元函式過載雙目運算子(+)#include
using namespace std;
class complex //複數類
//友元函式過載雙目運算子
friend complex operator+
(complex com1,complex com2)
;void
showsum()
;};complex operator+
(complex com1,complex com2)
//運算子過載函式
void complex:
:showsum()
else
}int
main()
2) 友元函式過載單目運算子(++):#include
using namespace std;
class point//座標類
friend void operator++
(point& point)
;//友元函式過載單目運算子++
void
showpoint()
;};void operator++
(point& point)
//友元運算子過載函式
void point:
:showpoint()
intmain()
輸出
(11,11)
2.2 運算子過載函式作為類的成員函式的形式:
對於成員函式過載運算子而言,雙目運算子的參數列中僅有乙個引數,而單目則無引數。同樣的是過載,為什麼和友元函式在引數的個數上會有所區別的。原因在於友元函式,沒有this指標。
class 類名
類外定義格式:
返回型別 類名:: operator 運算子(形參表)
1) 成員函式過載雙目運算子(+):#include
using namespace std;
class complex //複數類
//成員函式過載雙目運算子
complex operator+
(complex com1)
;void
showsum()
;};complex complex:
:operator+
(complex com1)
void complex:
:showsum()
else
}int
main()
2)成員函式過載單目運算子(++)#include
using namespace std;
class point//座標類
void operator++()
;//成員函式過載單目運算子++
void
showpoint()
;};void point:
:operator++()
//成員運算子過載函式
void point:
:showpoint()
intmain()
輸出
[11,11]
三、過載輸出運算子<<#include
using namespace std;
class people
~people()
friend ostream& operator<<
(ostream &os,people p)
;private:
int m_id;
int m_pwd;};
ostream& operator <<
(ostream &os,
const people p)
intmain()
輸出:your id is:
1 and password is:
123your id is:
2 and password is:
456
注:
輸出運算子的第乙個形參是非常量ostream物件的引用。之所以非常量是因為向流寫入內容會改變其狀態;而該形參是引用是因為我們無法直接複製乙個ostream物件。
第二個形參一般是常量引用,該常量是我們要列印的類型別,之所以是常量是因為我們列印一般不會改變物件內容;是引用是我們希望避免複製形參。
返回值返回的是ostream類物件的引用,為了與其他輸出運算子保持一致,operator《一般要返回它的ostream形參。同時為了進行連續的運算,如cout< c 函式過載 在同乙個作用域內,可以宣告幾個功能類似的同名函式,但這些同名函式的形式引數必須不同。c 中的運算子過載 過載的運算子是帶有特殊名稱的函式,函式名是由關鍵字 operator 和其後要過載的運算子符號構成的。可過載運算子 不可過載運算子 可過載運算子 雙目算術運算子,關係運算子,邏輯運算... 在同乙個作用域內,可以宣告幾個功能類似的同名函式,但是這些同名函式的形式引數 指引數的個數 型別或者順序 必須不同。不能僅通過返回型別的不同來過載函式。下面的例項中,同名函式print 被用於輸出不同的資料型別 include using namespace std class printf voi... c 允許在同一作用域中的某個函式和運算子指定多個定義,分別稱為函式過載和運算子過載。過載宣告是指乙個與之前已經在該作用域內宣告過的函式或方法具有相同名稱的宣告,但是它們的引數列表和定義 實現 不相同。當您呼叫乙個過載函式或過載運算子時,編譯器通過把您所使用的引數型別與定義中的引數型別進行比較,決定選...C 過載運算子和過載函式
C 過載函式和過載運算子
C 過載運算子和過載函式