天天看點

C++對C的擴充之函數重載

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"傾軋,就可以了,也就是要取消傾軋必須都取消,要不取消都不取消。

c++

繼續閱讀