目錄
1.命名空間
2.缺省參數(shù)
3.函數(shù)重載
1.命名空間
在C++中定義命名空間我們需要用到namespace關(guān)鍵字,后面跟上命名空間的名字,結(jié)構(gòu)框架有點類似結(jié)構(gòu)體(如圖所示)
上面的代碼我一一進行講解:
1.我們先來說第三行和main函數(shù)中的代碼意思,第三行代碼的意思是展開std庫的空間,std是C++的一個基礎(chǔ)庫,我們?yōu)槭裁匆归_它呢?包了iostream文件難道不行嗎?這就要涉及到編譯C++程序時編譯器的搜索方式了,編譯器默認是從局部空間和全局空間來進行搜索,而我們的cout和endl雖然在iostream文件里,但它不在編譯器的默認搜索范圍之內(nèi),所以想使用cout和endl我們有兩種方式:
第一種就是上述展開std庫的方法;
第二種我們可以指定到對應(yīng)的空間域進行調(diào)用(如圖所示)
這是一種方法,但是這樣寫太麻煩了,所以在一般的聯(lián)系中我們不會寫到太多的代碼,這個時候我們就可以將std庫展開,展開就相當于是全局域,就在我們編譯器的默認搜索范圍之內(nèi)了。
::就是我們的域作用限制符,前面跟上空間名稱就可以指定到相應(yīng)的位置。
2.接下來我們來了解命名空間域,它就相當于劃分了一塊地盤,里面住著各種成員,比如張三家有一只羊,李四家也有一只羊,拿誰家的羊有地址就行,張三家的羊跟李四家的也沒有關(guān)系。
所以在C語言中同一個變量名不能定義兩次,但在C++中就可以。
2.缺省參數(shù)
缺省參數(shù)是聲明或定義函數(shù)時為函數(shù)的參數(shù)指定一個缺省值,在調(diào)用該函數(shù)時如果沒有指定實參則采用該缺省值,有則使用實參。
如圖所示,缺省參數(shù)使C++在調(diào)用函數(shù)的時候比C更加靈活。
缺省參數(shù)主要分為兩種:
1.全缺省參數(shù)
顧名思義,全缺省參數(shù)就是給每一個參數(shù)都設(shè)置一個缺省值;
2.半缺省參數(shù)
半缺省參數(shù)就是不全部設(shè)置缺省值的情況。
注意:
1.半缺省參數(shù)的設(shè)置必須從右往左依次設(shè)置,不能間隔著給。
2.函數(shù)的聲明與定義如果分開寫的話不能同時寫缺省參數(shù),缺省參數(shù)要寫在聲明中。
如上圖,我們想寫的是同一個函數(shù),但是缺省值不一樣,這個時候我們?nèi)绻粋鲗崊?,編譯器該選哪個值?所以為了避免這種情況,就規(guī)定了聲明和定義不能同時寫缺省值,那么為什么要寫在聲明中呢?這是因為我們測試時是會包含a.h頭文件的,編譯器在預(yù)處理階段會將頭文件展開,相當于把頭文件的內(nèi)容復(fù)制到測試文件中,在編譯階段檢測到是有這么個函數(shù)聲明,所以不會報錯。
3.缺省參數(shù)必須是常量或全局變量。
4.C語言不支持缺省參數(shù)。
3.函數(shù)重載
自然語言中,一個詞可以有多重含義,人們可以通過上下文來判斷該詞的真正含義,即該詞被重載了。
比如:以前有一個笑話,中國有兩個體育項目大家根本不用看,也不用擔(dān)心。一個是乒乓球,一個是男足。前者是“誰也贏不了!”,后者是“誰也贏不了!”。
3.1函數(shù)重載的概念
函數(shù)重載:是函數(shù)的一種特殊情況,C++允許在同一作用域中聲明幾個功能類似的同名函數(shù),這些同名函數(shù)的形參列表(參數(shù)個數(shù)或類型或類型順序不同),常用來處理功能類似數(shù)據(jù)類型不同的問題。(如下圖所示)
#include<iostream> using namespace std; // 1、參數(shù)類型不同 int Add(int left, int right) { cout << "int Add(int left, int right)" << endl; return left + right; } double Add(double left, double right) { cout << "double Add(double left, double right)" << endl; return left + right; } // 2、參數(shù)個數(shù)不同 void f() { cout << "f()" << endl; } void f(int a) { cout << "f(int a)" << endl; } // 3、參數(shù)類型順序不同 void f(int a, char b) { cout << "f(int a,char b)" << endl; } void f(char b, int a) { cout << "f(char b, int a)" << endl; } int main() { Add(10, 20); Add(10.1, 20.2); f(); f(10); f(10, 'a'); f('a', 10); return 0; }
5.2C++支持函數(shù)重載的原理
1. 實際項目通常是由多個頭文件和多個源文件構(gòu)成,而通過C語言階段學(xué)習(xí)的編譯鏈接,我們可以知道,【當前a.cpp中調(diào)用了b.cpp中定義的Add函數(shù)時】,編譯后鏈接前,a.o的目標
文件中沒有Add的函數(shù)地址,因為Add是在b.cpp中定義的,所以Add的地址在b.o中。那么
怎么辦呢?
2. 所以鏈接階段就是專門處理這種問題,鏈接器看到a.o調(diào)用Add,但是沒有Add的地址,就
會到b.o的符號表中找Add的地址,然后鏈接到一起。
3. 那么鏈接時,面對Add函數(shù),鏈接接器會使用哪個名字去找呢?這里每個編譯器都有自己的函數(shù)名修飾規(guī)則。
4. 由于Windows下vs的修飾規(guī)則過于復(fù)雜,而Linux下g++的修飾規(guī)則簡單易懂,下面我們使
用了g++演示了這個修飾后的名字。
5. 通過下面我們可以看出gcc的函數(shù)修飾后名字不變。而g++的函數(shù)修飾后變成【_Z+函數(shù)長度+函數(shù)名+類型首字母】。
我們在Linux中寫了Add和Func兩個函數(shù),接下來我們看看gcc編譯后函數(shù)的名字
如圖所示,還是Add和Func,沒有任何變化。
接下來我們來看看C++
我們還是寫同樣的代碼來進行更直觀的比較
在linux下,采用g++編譯完成后,函數(shù)名字的修飾發(fā)生改變,編譯器將函數(shù)參數(shù)類型信息添加到修改后的名字中。
windows下的命名規(guī)則:
對比Linux會發(fā)現(xiàn),windows下vs編譯器對函數(shù)名字修飾規(guī)則相對復(fù)雜難懂,但道理都是類似的,我們就不做細致的研究了。
6. 通過這里就理解了C語言沒辦法支持重載,因為同名函數(shù)沒辦法區(qū)分。而C++是通過函數(shù)修飾規(guī)則來區(qū)分,只要參數(shù)不同,修飾出來的名字就不一樣,就支持了重載。文章來源:http://www.zghlxwxcb.cn/news/detail-816495.html
7. 如果兩個函數(shù)函數(shù)名和參數(shù)是一樣的,返回值不同是不構(gòu)成重載的,因為調(diào)用時編譯器沒辦法區(qū)分。文章來源地址http://www.zghlxwxcb.cn/news/detail-816495.html
到了這里,關(guān)于C++中命名空間、缺省參數(shù)、函數(shù)重載的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!