C 拾遺 函式過載

2021-06-28 22:06:16 字數 1561 閱讀 2219

c++拾遺--函式過載

關於作用域,需要指出幾點事實

用大括號{}括起來的區域處於同一作用域,常見的有函式體、for、if語句等。

同一作用域內不可出現同名的變數,若是函式同名,那就是函式過載問題。不同作用域內同名與否,沒影響。

所有的函式之外的區域就是全域性作用域。

首先需要指出,同一作用域中的函式才會出現過載問題。不同作用域中的函式即使是同名,且引數型別和返回值型別一致,也是兩個不同的函式。

當作用域存在巢狀關係時,隱藏現象會出現。

#include using namespace std;

//位於全域性作用域的var

int var = 0;

void print(void)

int main()

; //以下呼叫全為區域性的

cout << "var = " << var << endl;

print();

//呼叫全域性的

cout << "::var = " << ::var << endl;

::print();

cin.get();

return 0;

}

執行

由於main函式體巢狀在全域性作用域的內部,所以當出現同名物件時,會發生隱藏現象。若要呼叫全域性的物件,需使用全域性作用域運算子::。

需要進一步指出,隱藏只是現象,本質是物件名字查詢規則。c++的名字查詢規則是這樣的,從名字出現處到名字所處的作用域的起始處,這一段進行查詢。找到即不再查詢,找不到就跳到上一層作用域繼續查詢。

本示例**中,可以在main函式體內找到var和print,所以呼叫的就是區域性的。

隱藏現象表明,不同作用域的同名函式,不是過載關係。

const和過載的聯絡是,只能通過底層const區分過載。

#include using namespace std;

void print(const char *str)

void print(char *str)

int main()

執行

若把void print(const char *str)改為void print(char *const str),編譯後提示錯誤:

error c2084: function 'void print(char *const )' already has a body,也就是說頂層const無法區分過載。

至於頂層const和底層const的區別,name_cast 顯示型別轉換中有提到。

只有虛函式才存在覆蓋(override)或者覆寫問題。覆蓋類似隱藏,但不是過載。覆蓋現象我們在虛函式中進行討論。

特別地,main函式不能被過載。

本專欄目錄

所有內容的目錄

C 拾遺(二 函式)

1.引數陣列。c 的特色,允許函式引數的最後指定乙個引數陣列,可以使用個數不定的引數呼叫,用params關鍵字定義 static double sumvals params double vals return sum 呼叫sumvals 1,2,3 2.值引數和引用引數。引用引數使用關鍵字ref指...

函式呼叫拾遺

通常構成函式主題的js 在定義之時是不會被執行的,只有在呼叫函式是才會被執行 有4種方式可以呼叫js函式 定義函式 factorial function factorial var probability factorial 5 以函式形式呼叫的函式通常不適用this關鍵字 方法呼叫和函式呼叫區別在...

C語言拾遺

main函式引數 c語言規定main函式引數只能有兩個,習慣上這兩個引數寫成argc和argv。c語言還規定argc必須是整形變數,argv必須是指向字串的指標陣列。因此,main函式的函式頭應該寫為 main argc,argv int argc char argv 或者 main int arg...