過載其實在是乙個很基礎的概念,我們用的時候也很多,但是我老是忘記相關的約定約束,下面就自己學習的相關問題做乙個整理吧,主要說明函式過載的含義、函式過載的形式等問題。
參考書籍:《c++ primer》
簡而言之,如果同一作用域的幾個函式名字相同,但形參列表(引數型別和數量)不同,則稱為過載函式。需要注意的是,我們定義過載函式的目的往往是因為一些函式的功能類似,而形參不同,如下:
void
print
(int a)
;void
print
(double a)
;
1)main函式不能過載;
2)引數列表不同是指引數型別和數量的不同,但不包括返回值;
void
fun(
int a)
;// 正確,形參型別為int
void
fun(
double a)
;// 正確,形參型別為double
void
fun(
double a,
double b)
;// 正確, 兩個引數
bool fun
(double a,
double b)
;// 錯誤,與上乙個比只是返回型別不同
3)頂層的const形參無法和另乙個沒有頂層const的形參區分開來(我覺得這個有點難理解hhh);
頂層const與底層const概述:頂層const表示指標本身就是個常量,而底層const表示指標所指的物件是乙個常量,如下:
int i =0;
int*
const p1 =
&i;// 指向int型別的常指標,指標本身是個常量,無法再指其他,這是頂層const
const
int ci =42;
const
int*p2 =
&ci;
// 指向常int的指標,指標本身不是常量,只是指的地方是,這是底層const
所以以下函式無法過載:
record lookup
(phone phone)
;record lookup
(const phone phone)
;// 重複宣告了lookup(phone phone);
record lookup
(phone *phone)
;record lookup
(phone *
const phone)
;// 重複宣告了lookup(phone *phone);
4)如果形參是某種型別的指標或引用,則通過區分指向的是常量物件還是非常量物件可以實現過載;也就是說對於接受引用或指標的函式來說,物件是常量還是非常量對應的形參是不同的;
所以以下是可以過載的:
record lookup
(phone &phone)
;// 該函式作用於phone的引用
record lookup
(const phone &phone)
;// 該函式作用於phone的常引用
record lookup
(phone *phone)
;// 該函式作用於指向phone的指標
record lookup
(const phone *phone)
;// 該函式作用於指向phone常量物件的指標
這一塊沒有深究,編譯器首先根據函式名在就近的作用域尋找,然後找到目標函式後進行型別匹配,如果發現目標函式多餘乙個,則進行引數匹配,最佳匹配者將獲得一次呼叫機會,要是找不到最佳匹配者,發現有些差不多的(可以進行引數型別轉換)的也可以將就一下,要是找不到則報錯(所以你會發現和返回值都沒啥關係);
如有問題,歡迎指正!
C 學習筆記 函式過載
c 函式過載詳解 我們在開瓶瓶罐罐的時候,經常會遭遇因各種瓶口規格不同而找不到合適的工具的尷尬。所以有時候就為了開個瓶,家裡要備多種規格的開瓶器。同樣是開個瓶子嘛,何必這麼麻煩?於是有人發明了多功能開瓶器,不管啤酒瓶汽水瓶還是軟木塞的紅酒瓶都能輕鬆開啟。然而開瓶器的問題也會發生到程式設計中。比如我們...
C 學習筆記 函式過載
1 什麼是函式過載 c 允許在同一作用域中宣告幾個功能類似的同名函式,這些同名函式的形參列表 引數個數 型別 順序 必須不同,常用來處理實現功能類似資料型別不同的問題。int add int a,int b double add double a,double b int main 注意 main函...
C 學習筆記二函式 函式過載
函式 都以static 開頭namespace 可變引數的函式 string country china vfunc names vfunc country sayhello tom 張大虎 狗剩 console.readkey static void vfunc params string val...