C++之函數(shù)的重載
一、C++ 函數(shù)重載
C++ 致力于簡化編程,能過函數(shù)重名來達(dá)到簡化編程的目的
1.重載規(guī)則
1.函數(shù)名相同
2.參數(shù)的個數(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); //與第一個函數(shù)有沖突
2.匹配原則
1.嚴(yán)格匹配,找到則調(diào)用
2.通過隱式轉(zhuǎn)換尋求一個匹配,找到則調(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)換。遇到這種情型,則會引起二義性
例:將上題上的 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)用時強(qiáng)轉(zhuǎn)
3.重載底層實現(xiàn)
C++利用 name mangling(傾軋)技術(shù),來改名函數(shù)名,區(qū)分參數(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ā)生在兩個階段,.cpp 編譯階段,和.h 的聲明階段。
只有兩個階段同時進(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 文件所對應(yīng)的.h 文件時,.h 文件要發(fā)生name manling 行為,因而會發(fā)生在鏈接的時候的錯誤。C++為了避免上述錯誤的發(fā)生,重載了關(guān)鍵字 extern。只需在要避免 name manling的函數(shù)前,加 extern “C” 如有多個,則 extern “C”{}
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
VS2022 CUDA環(huán)境配置的實現(xiàn)步驟
本文主要介紹了VS2022 CUDA環(huán)境配置的實現(xiàn)步驟,文中通過圖文示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05C++ Boost Coroutine使用協(xié)程詳解
通過Boost.Coroutine,可以在C++中使用協(xié)程。協(xié)程是其他編程語言的一個特性,通常使用關(guān)鍵字yield來表示協(xié)程。在這些編程語言中,yield可以像return一樣使用2022-11-11解析C語言中結(jié)構(gòu)體struct的對齊問題
這篇文章主要介紹了C語言中結(jié)構(gòu)體struct的對齊問題,作者深入到內(nèi)存分配方面來進(jìn)行解析,需要的朋友可以參考下2016-04-04如何通過函數(shù)指針調(diào)用函數(shù)(實現(xiàn)代碼)
指針可以不但可以指向一個整形,浮點型,字符型,字符串型的變量,也可以指向相應(yīng)的數(shù)組,而且還可以指向一個函數(shù)2013-09-09