C++知識點---名稱空間、預設引數、過載
阿新 • • 發佈:2018-12-30
1.什麼是C++?
- C++延續了C語言的語法使用,在其基礎上又增加了自己的特性
- 對於C++而言,可以進行過程化的設計,也可以根據抽象資料型別的特點,將其認為是某一物件,基於這種物件進行程式設計
2. C++與C語言的差異
- 資料型別:從基本資料型別來看,C++增加了邏輯型bool;從自定義型別來看,C++增加了類
- 關鍵字:C語言的關鍵字只有32個,C++在此基礎上將關鍵字增加到98個關鍵字
- 命名衝突:C語言不支援全域性命名衝突的情況(即重新命名);C++存在名字空間域,解決了命名衝突的問題
3. C++中的名稱空間
- 以關鍵字namespace開始,其後接名稱空間的名字
- 名稱空間相當於作用域,空間裡的成員,外部訪問時必須指定成員名字存在的作用域中(即名稱空間)
- ::是作用域解析符,某成員名字屬於哪個作用域;下面的例子中 s1::a;表示a在s1的作用域裡
例:
namespace s1
{
int a = 10;
}
namespace s2
{
int a = 20;
}
int main()
{
cout << s1::a << endl;
cout << s2::a << endl;
system("pause");
return 0;
}
4.預設引數
- 理解:預設引數指可給函式引數賦值,留做備用,當呼叫函式時,沒有傳參時即可使用設定的引數預設值
規則:設定預設值的引數只能是最後的幾個引數。也就是說某一個引數一旦設定了預設值,其後而的引數也必須設定預設值。
例:
int Add1(int x, int y, int z)//沒有預設值
{
return x + y + z;
}
int Add2(int x, int y, int z = 3)//半預設
{
return x + y + z;
}
int Add3(int x = 1, int y = 2, int z = 3)//全預設
{
return x + y + z;
}
int Add4(int x, int y = 2, int z)//錯誤
{
return x + y + z;
}
int main()
{
cout << Add1(3,6,9) << endl;
cout << Add2(6,7) << endl;
cout << Add3() << endl;
system("pause");
return 0;
}
5.函式過載
5.1 什麼是函式過載
在同一作用域內,一組函式的函式名相同,引數列表不同(個數不同/型別不同),返回值可同可不同
例如:
void Func1(int a);
void Func1(int a,double c);
int Func1(double c,int a);
這幾個函式即為函式過載;和返回值無關,函式名相同,對應引數不同,引數個數也不相同
5.2 為什麼需要函式過載
根據函式過載的定義可從函式過載的幾個特點來分析:
- 函式名相同:在C語言的語法中,同一作用域中不允許函式名重複,那麼在實現一個功能時就需要定義多個函式,例如:1+2,1+2+3,1.0+2.0+3.0+4.0,雖然這些加法只是個數不同,型別不同,但在呼叫函式就不能使用同一函式名,因此為了減少工作量,引入函式過載可解決這一問題
引數不同:上面的例子只是引數列表(型別,個數)不同,故相同功能的函式只需要設計不同的引數即可
幾個例子
int Add(int x, int y)
{
return x + y;
}
double Add(double x, double y)
{
return x + y;
}
int Add(int x, int y, double z)
{
return x + y + z;
}
int main()
{
cout << Add(1, 2) << endl;
cout << Add(3.0, 4.0) << endl;
cout << Add(1, 2,3.0) << endl;
system("pause");
return 0;
}
結果:
分析:
上述例子中存在函式過載,幾個Add函式實現相同的功能,不會發生命名重複等諸多情況,都能得到相應的結果
5.3 C++支援過載的原因
在說明這個問題之前,我們在linux下檢視同一段程式碼分別用C語言編譯和C++編譯時的彙編程式碼
程式碼:
#include<stdio.h>
int Add(int x,int y)
{
return x+y;
}
int main()
{
int ret=Add(1,2);
printf("%d",ret);
return 0;
}
C語言:
C++:
分析:
- 從上圖中可以看出,C++在呼叫函式時Add函式名已經改變<_Z3Addii>, 不僅僅是函式名,還有引數的型別,而C語言呼叫時Add函式名< Add >沒有改變
- C語言中一個函式就是一個地址,即使引數不同,也是相同的地址,編譯器不能識別,故而C語言中沒有過載函式的概念
C++中一個函式名可有多個地址,當引數不同時,地址也不相同,編譯器可根據不同的地址去呼叫對應的函式來完成函式的功能,因此C++中支援函式過載的概念
綜上所述:C++能夠支援過載是因為他有自己的函式名修飾規則,在編譯時可以識別相同函式名,不同引數列表的函式