C語言不支援函數重載,若出現同名函數,不管參數個數,類型,順序是否不同,一律定為沖突
C++支援函數重載,其特點:
1. 函數名相同
2.參數類型,個數,順序不同
函數重載與傳回類型無關
函數重載調用規則:
1.完全類型比對
2.若不存在完全類型比對,則使用隐式類型比對原則
注意:int 到long , double 存在二義性, float 到int, double 同樣存在二義性,這是不允許出現的
函數重載原理:
C++利用 name mangling(傾軋)技術,來改名函數名,區分參數不同的同名函數。
例如:
void print(int a){ //傾軋技術會把這個函數改名為print_i
cout << "void print(int a)" <<endl;
}
int print(char a){ //傾軋技術會把這個函數改名為print_c
cout << "void print(char a)" <<endl;
}
void print(int a, char b){ //傾軋技術會把這個函數改名為print_ic
cout << "void print(int a, char b)" <<endl;
}
void print(char b, int a){ //傾軋技術會把這個函數改名為print_ci
cout << "void print(char b, int a)" <<endl;
}
若加入extern “C”則取消傾軋,函數調用時,尤其是調用頭檔案中的函數時,要傾軋都傾軋,不然都不傾軋,否則找不到函數,例如:
//print.h檔案
void print(int a);
//print.cpp檔案
#include"print.h"
extern “C”{
void print(int a){ //傾軋技術會把這個函數改名為print_i
cout << "void print(int a)" <<endl;
}
}
//main.cpp檔案
#include <iostream>
#include“print.h”
int main(){
int a = 1;
print(a);
}
因為main.cpp加入了print.h檔案,print.h保留了傾軋,main.cpp同樣保留了傾軋,而print.cpp中取消了傾軋,main函數調用print(a)時就找不到print_i(int a)(改名後的)的定義,就會報錯。若在print.cpp檔案中去掉extern"C"傾軋,就可以了,也就是要取消傾軋必須都取消,要不取消都不取消。