meo學習筆記2 函式過載(C )

2021-10-04 08:17:30 字數 1959 閱讀 6147

過載其實在是乙個很基礎的概念,我們用的時候也很多,但是我老是忘記相關的約定約束,下面就自己學習的相關問題做乙個整理吧,主要說明函式過載的含義、函式過載的形式等問題。

參考書籍:《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...