C++:函式的過載、inline函式、C/C++相互呼叫
一、過載(overloading) :函式名字相同,而引數不同。返回型別可以相同也可以不同。
若有題目為:實現兩個數相加,一般我們都會想到如下程式碼:
int Sum(int a,int b)
{
return a+b;
}
但事實我們考慮並不全面,因為並沒有給出要求是實現兩個整型數相加,我們還需要考慮double、float等等其他型別,需要全面考慮,但之前在c語言中不允許實現如下程式碼 :
int Sum(int a,int b)//?[email protected]@[email protected]
{
return a+b;
}
doubel Sum(doubel a,double b)//?[email protected]@[email protected]
{
return a+b;
}
但在c++中我們可以實現,原因是因為C語言和C++的符號生成規則不同!
符號生成規則:?函式名稱@@Y呼叫約定 返回值型別 形參型別 形參型別@Z
函式返回值
函式名稱
形參列表:形參型別、個數、順序
int Add(int, int); // [email protected]@[email protected]
double Add(int, int); // [email protected]@[email protected]
double Add1(int, int); // [email protected] @[email protected]
double Add1(double, double); // [email protected]@[email protected]
double Add1(double, double, double);// [email protected]@[email protected]
double Add1(double,int); //[email protected]@[email protected]
double Add1(int, double); //[email protected]@[email protected]
過載特點:
1.不能使編譯器產生二義性
2.不依賴返回值
3.三要素:同作用域、同名、引數不同
二、inline行內函數:編譯階段,在呼叫點直接將程式碼展開
inline int Sum(int a, int b)//_Sum_int_int .text 本檔案
{
return a + b;
}
1.行內函數和static修飾的函式的區別:
共同點:都是本檔案可見;
不同點:行內函數沒有棧幀的開闢和清理的開銷;
static修飾的函式有開棧和清棧的開銷;
2.優點:提高效率;
3.缺點:以程式碼膨脹為代價,空間浪費大;
建議適用內聯的情況:函式程式碼的執行開銷小於函式程式碼的開棧、清棧開銷;
4.注意事項:
1.寫在標頭檔案;
2.只在release版本生效,debug版本不生效,依舊有開棧清棧過程;
3.並不是所有函式都能寫成內聯,例如:遞迴、while、switch不可以;
4.基於實現,不是基於宣告的,若加在宣告中是無效的。
三、C/C++的相互呼叫
1.C++呼叫C方法:用 extern "C" (其包含的程式碼以C語言處理)將宣告包含
extern "C"
{
extern int Sum(int, int);
}
2.C呼叫C++方法:用 extern "C" (其包含的程式碼以C語言處理)將程式碼包含,分兩種情況
①:C++能修改:在.cpp檔案中新增extern宣告
extern "C"
{
int Sum(int a, int b)
{
return a+b;
}
}
②:C++不能修改:新增中間層檔案
//新建一個.cpp
extern int Sum(int, int);
extern "C"
{
int MySum(int a, int b)
{
return Sum(a, b);
}
}
判斷C++是否能修改:
#ifdef __cplusplus//如果巨集定義,C++會編譯好,C未定義
extern "C"
{
#endif
int Sum(int a, int b)
{
return a + b;
}
#ifdef __cplusplus
}
#endif