C++ 函式的過載 詳解
阿新 • • 發佈:2018-12-21
在有的情境下我們需要實現幾個功能相似的函式,可能只有細節上有區別。比如求兩個數的和,這兩個數有多重型別,可能是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++編譯時名稱修飾比較複雜,語言不好描述,可以看以下圖片。