1. 程式人生 > >C++ 函式的過載 詳解

C++ 函式的過載 詳解

在有的情境下我們需要實現幾個功能相似的函式,可能只有細節上有區別。比如求兩個數的和,這兩個數有多重型別,可能是int,float,double,char,bool等。如果在C語言中我們往往需要設計多個不同名稱的函式。例如:

int Add1(int a, int b);       //求兩個int型別的數之和
float Add2(float a, float b); //求兩個float型別的數之和
char  Add3(char a, char b);   //求兩個char型別的數之和

但在C++中,這完全沒有必要。C++ 允許多個函式擁有相同的名字,只要它們的引數列表不同就可以,這就是函式的過載(Function Overloading)。藉助過載,一個函式名可以有多種用途。

函式過載的前提:必須在相同的作用域

函式過載的條件:名字必須相同、引數列表一定不同(個數、型別、型別次序),返回值型別是否相同沒有關係

函式的過載的規則:

  • 函式名稱必須相同。
  • 引數列表必須不同(個數不同、型別不同、引數排列順序不同等)。
  • 函式的返回型別可以相同也可以不相同。
  • 僅僅返回型別不同不足以成為函式的過載。

【示例】藉助函式過載交換不同型別的變數的值:

#include <iostream>
using namespace std;
//交換 int 變數的值
void Swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
//交換 float 變數的值
void Swap(float *a, float *b)
{
    float temp = *a;
    *a = *b;
    *b = temp;
}
//交換 char 變數的值
void Swap(char *a, char *b)
{
    char temp = *a;
    *a = *b;
    *b = temp;
}
//交換 bool 變數的值
void Swap(bool *a, bool *b)
{
    char temp = *a;
    *a = *b;
    *b = temp;
}
int main()
{
//交換 int 變數的值
    int n1 = 100, n2 = 200;
    Swap(&n1, &n2);
    cout << n1 << ", " << n2 << endl;
//交換 float 變數的值
    float f1 = 12.5, f2 = 56.93;
    Swap(&f1, &f2);
    cout << f1< < ", " << f2 << endl;
//交換 char 變數的值
    char c1 = 'A', c2 = 'B';
    Swap(&c1, &c2);
    cout << c1 << ", " << c2 << endl;
//交換 bool 變數的值
    bool b1 = false, b2 = true;
    Swap(&b1, &b2);
    cout << b1 << ", " << b2 << endl;
    return 0;
}

C++ 是如何做到函式過載的,為什麼C語言不可以

函式在編譯的時候會對函式名重新修飾,C語言的名字修飾規則非常簡單,只是在函式名字前面添加了下劃線。比如,對於以下程式碼,在最後連結時就會出錯

而函式在C++編譯時名稱修飾比較複雜,語言不好描述,可以看以下圖片。