C++之函數的重載

一、C++ 函數重載

C++ 致力於簡化編程,能過函數重名來達到簡化編程的目的

1.重載規則

1.函數名相同

2.參數的個數不同,類型不同,順序不同,都可以構成重載

3.返回值類型必須相同,不同則不可以構成重載

例如:

void func(int a); //ok
void func(char a); //ok
void func(char a,int b); //ok
void func(int a, char b); //ok
char func(int a); //與第一個函數有沖突

2.匹配原則

1.嚴格匹配,找到則調用

2.通過隱式轉換尋求一個匹配,找到則調用

#include <iostream>
#include <iomanip>
using namespace std;
void print(double a){
	cout<<a<<endl;
}
void print(int a){
	cout<<a<<endl;
}
int main(){
	print(1); // print(int)
	print(1.1); // print(double)
	print('a'); // print(int)
	print(1.11f); // print(double)
	return 0;
}

輸出結果

C++ 允許,int 到 long 、double,double 到 int 、float 隱式類型轉換。遇到這種情型,則會引起二義性

例:將上題上的 print(int a)中的類型 int 改為double

rror: call of overloaded 'print(int)' is ambiguous
print(1); // print(int)
error: call of overloaded 'print(char)' is ambiguous
print('a'); 

解決方法,在調用時強轉

3.重載底層實現

C++利用 name mangling(傾軋)技術,來改名函數名,區分參數不同的同名函數。

實現原理:用 v-c-i-f-l-d 表示 void char int float long double 及其引用。

void func(char a); // func_c(char a)
void func(char a, int b, double c);//func_cid(char a, int b, double c)

4.extern “C”

name mangling 發生在兩個階段,.cpp 編譯階段,和.h 的聲明階段。

隻有兩個階段同時進行,才能匹配調用。

mystring.h

extern "C"{
	int myStrlen(char *str);
}

mystring.cpp

#include "mystring.h"
int myStrlen(char *str)
{
	int len = 0;
	while(*str++)
	len++;
	return len;
}

main.cpp

#include <iostream>
#include "mystring.h"
using namespace std;
int main()
{
	char *p = "china";
	int len;
	len = myStrlen(p);
	return 0;
}

C++ 完全兼容 c 語言,那就面臨著,完全兼容 c 的類庫。由.c 文件的類庫文件中函數名,並沒有發生 name mangling 行為,而我們在包含.c 文件所對應的.h 文件時,.h 文件要發生name manling 行為,因而會發生在鏈接的時候的錯誤。C++為瞭避免上述錯誤的發生,重載瞭關鍵字 extern。隻需在要避免 name manling的函數前,加 extern “C” 如有多個,則 extern “C”{}

總結

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!

推薦閱讀: