1. 程式人生 > >C++中預設引數和函式過載

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語言編譯的。