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...