C++中預設引數和函式過載
預設引數概念:
預設引數是宣告或定義函式時為函式的引數指定一個預設值,在呼叫該函式時,如果沒有指定實參則採用該預設值,否則使用指定的實參。
舉例說明:
#include<malloc.h>
void *GetMemory(int size = 100)
{
cout << size << endl;
return malloc(size);
}
int main()
{
GetMemory();
GetMemory(10);
return 0;
}
預設引數分類:
(1)全預設引數
void TestFunc1(int a = 1, int b = 2, int c = 3)
(2)半預設引數
void TestFunc2(int a , int b =2, int c=3 )
注意:
(1) 半預設引數必須從右往左依次給出,不能間隔著給。
void TestFunc1(int a = 1, int b , int c = 3)//這是錯誤的
(2 ) 預設引數不能再函式宣告和定義中同時出現
void TestFunc3(int a = 10);
void TestFunc3(int a = 20)//不知道是用10還是20
{
}
(3) 預設值必須是常量或者全域性變數
(4) C語言不支援(編譯器不支援)
函式過載
是函式的一種特殊情況,c++允許在同一作用域中申明幾個功能類似的同名函式,這些同名函式的形參列表(引數個數,型別,順序 )必須不同,常用來處理實現功能類似資料型別不同的問題。
如下圖程式碼:
int Add(int left, int right)
{
return left + right;
}
double Add(double left, double right)
{
return left + right;
}
char Add(char left, char right)
{
return left + right;
}
int main()
{
cout << Add(1, 2) << endl;
cout << Add(1.0, 2.0) << endl;
cout << Add('1', '2') << endl;
return 0;
}
上面Add函式構成過載。(編譯器在編譯期間,需要根據實參的型別確定具體需要呼叫哪個函式.)
引數列表不同具體體現在哪些方面?
//函式1
void TestFunc(int a)
{}
//函式2
//引數的型別不一樣
void TestFunc(char a)
{}
//函式3
//引數的個數不一樣
void TestFunc(int a,char b)
{}
//函式4
//引數型別的次序不一樣
void TestFunc(char a,int b)
{}
//函式5
//int TestFunc(int a)
//{}
需注意:(1)如果兩個函式僅僅只是返回值型別不一樣,不能形成過載(函式1和函式5)。
(2)儘量避免無參和帶有全預設引數的函式形成過載
//這種呼叫方式是錯誤的,編譯器不知道會呼叫哪一個函式
void TestFunc()
{}
void TestFunc(int a = 10)
{}
int main()
{
TestFunc();
retur;
}
執行結果:
常見的面試題:(1)為什麼c++支援函式過載?而c語言不行?
答:在c語言中,編譯器對函式名字的修飾規則:簡單的在函式名字前面加_
而在C++中
編譯器對函式名字的修飾規則:把函式的返回值型別和引數型別編譯到函式的名字中(不同的編譯器可能不同)
只要引數列表不同,在底層處理時會把它當成不同的函式來處理。
注意: 在VS中,當返回值型別不一樣時,儘管在底層處理時名字不一樣,也不能形成函式過載(可能是以前編譯器沒有考慮到這一點)。
(2)在c++中,如何按照c語言的風格來編譯?
答:在函式名前面加 extern “C”
extern "C" int Add(int left, int right);//按照c語言的風格編譯
int main()
{
Add(1, 2);
return 0;
}
以上程式碼即使在C++工程下,也是按照C語言編譯的。