C++拾遺--函數重載

                      C++拾遺--函數重載

前言

    函數重載(overloaded)似乎並不難,至於函數重載規則,比較簡單,沒什麼好講的。但仍有一些問題值得注意。下面從幾個關鍵詞入手:

正文

1.作用域

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

  1. 用大括號{}括起來的區域處於同一作用域,常見的有函數體、for、if語句等。
  2. 同一作用域內不可出現同名的變量,若是函數同名,那就是函數重載問題。不同作用域內同名與否,沒影響。
  3. 所有的函數之外的區域就是全局作用域。
首先需要指出,同一作用域中的函數纔會出現重載問題。不同作用域中的函數即使是同名,且參數類型和返回值類型一致,也是兩個不同的函數。

2.隱藏

當作用域存在嵌套關係時,隱藏現象會出現。
#include <iostream>
using namespace std;
//位於全局作用域的var
int var = 0;
void print(void)
{
	cout << "全局print" << endl;
}
int main()
{
	//位於局部作用域的g_var會隱藏位於全局作用域的g_var
	int var = 1;
	//局部print同樣會隱藏全局print
	auto print = [](void){
		cout << "局部print" << endl;
	};
	//以下調用全爲局部的
	cout << "var = " << var << endl;
	print();
	//調用全局的
	cout << "::var = " << ::var << endl;
	::print();
	cin.get();
	return 0;
}
運行


由於main函數體嵌套在全局作用域的內部,所以當出現同名對象時,會發生隱藏現象。若要調用全局的對象,需使用全局作用域運算符::。
需要進一步指出,隱藏只是現象,本質是對象名字查找規則。C++的名字查找規則是這樣的,從名字出現處到名字所處的作用域的起始處,這一段進行查找。找到即不再查找,找不到就跳到上一層作用域繼續查找。
本示例代碼中,可以在main函數體內找到var和print,所以調用的就是局部的。
隱藏現象表明,不同作用域的同名函數,不是重載關係。

3.const和重載

const和重載的聯繫是,只能通過底層const區分重載。
#include <iostream>
using namespace std;
void print(const char *str)
{
	cout << "void print(const char *str) call" << endl;
	cout << str;
}
void print(char *str)
{
	cout << "void print(char *str) call" << endl;
	cout << str;
}
int main()
{
	char str[] = "David";
	print("zhangxiang");
	cout << endl;
	print(str);
	cin.get();
	return 0;
}
運行


若把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 顯示類型轉換中有提到。

3.覆蓋

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


特別地,main函數不能被重載。



本專欄目錄
所有內容的目錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章