C++之函數(shù)的重載
一、C++ 函數(shù)重載
C++ 致力于簡化編程,能過函數(shù)重名來達(dá)到簡化編程的目的
1.重載規(guī)則
1.函數(shù)名相同
2.參數(shù)的個(gè)數(shù)不同,類型不同,順序不同,都可以構(gòu)成重載
3.返回值類型必須相同,不同則不可以構(gòu)成重載
例如:
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); //與第一個(gè)函數(shù)有沖突
2.匹配原則
1.嚴(yán)格匹配,找到則調(diào)用
2.通過隱式轉(zhuǎn)換尋求一個(gè)匹配,找到則調(diào)用
#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 隱式類型轉(zhuǎn)換。遇到這種情型,則會(huì)引起二義性
例:將上題上的 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');
解決方法,在調(diào)用時(shí)強(qiáng)轉(zhuǎn)
3.重載底層實(shí)現(xiàn)
C++利用 name mangling(傾軋)技術(shù),來改名函數(shù)名,區(qū)分參數(shù)不同的同名函數(shù)。
實(shí)現(xiàn)原理:用 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 發(fā)生在兩個(gè)階段,.cpp 編譯階段,和.h 的聲明階段。
只有兩個(gè)階段同時(shí)進(jìn)行,才能匹配調(diào)用。
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 文件的類庫文件中函數(shù)名,并沒有發(fā)生 name mangling 行為,而我們?cè)诎?c 文件所對(duì)應(yīng)的.h 文件時(shí),.h 文件要發(fā)生name manling 行為,因而會(huì)發(fā)生在鏈接的時(shí)候的錯(cuò)誤。C++為了避免上述錯(cuò)誤的發(fā)生,重載了關(guān)鍵字 extern。只需在要避免 name manling的函數(shù)前,加 extern “C” 如有多個(gè),則 extern “C”{}
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C語言中6組指針和自增運(yùn)算符結(jié)合方式的運(yùn)算順序問題
本文通過代碼實(shí)現(xiàn)分析了6種組合:* p++,(* p)++,* (p++),++* p,++( * p), * (++p),需要的朋友可以參考下2015-07-07
C++ 數(shù)字的反轉(zhuǎn)實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了C++ 數(shù)字的反轉(zhuǎn)實(shí)現(xiàn)實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06
Qt實(shí)現(xiàn)生成指定范圍內(nèi)隨機(jī)數(shù)與隨機(jī)字符串
這篇文章主要為大家詳細(xì)介紹了如何利用Qt實(shí)現(xiàn)生成指定范圍內(nèi)隨機(jī)數(shù)與隨機(jī)字符串,文中的示例代碼簡潔易懂,感興趣的小伙伴可以自己動(dòng)手嘗試一下2023-07-07
文件編譯時(shí)出現(xiàn)multiple definition of ''xxxxxx''的具體解決方法
以下是對(duì)文件編譯時(shí)出現(xiàn)multiple definition of 'xxxxxx'的解決方法進(jìn)行了詳細(xì)的分析介紹,如也遇到此問題的朋友們可以過來參考下2013-07-07

