C++筆記 第九課 函式過載分析(下)---狄泰學院
如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux
第九課 函式過載分析(下)
1.過載與指標
下面的函式指標將儲存哪個函式的地址?第一個
函式過載遇上函式指標
將過載函式名賦值給函式指標時
1.根據過載規則挑選與函式指標引數列表一致的候選者
2.嚴格匹配候選者的函式型別與函式指標的函式型別
9-1 函式過載VS函式指標
#include <stdio.h>
#include <string.h>
int func(int x)
{
return x;
}
int func(int a, int b)
{
return a + b;
}
int func(const char* s)
{
return strlen(s);
}
typedef int(*PFUNC)(int a);
int main(int argc, char *argv[])
{
int c = 0;
PFUNC p = func;
c = p(1);
printf("c = %d\n", c);
return 0;
}
執行結果
[email protected]:~/c++$ g++ 9-1.cpp
[email protected]:~/c++$ ./a.out
c = 1
注意
1.函式過載必然發生在同一個作用域中
2.編譯器需要用引數列表或函式型別進行函式選擇
3.無法直接通過函式名得到過載函式的入口地址
printf("%p\n", (int()(int, int))add);
printf("%p\n", (int()(int, int, int))add);
解釋:函式指標使用,挑選函式型別來進行函式選擇
2.C++和C相互呼叫
實際工程中C++和C程式碼相互呼叫是不可避免的
C++編譯器能夠相容C語言的編譯方式
C++編譯器會優先使用C++編譯方式
extern關鍵字能強制讓C++編譯器進行C方式的編譯
9-2 C++呼叫C函式
main.cpp #include <stdio.h> #ifdef __cplusplus extern "C" { #endif #include "add.h" #ifdef __cplusplus } #endif int main() { int c = add(1, 2); printf("c = %d\n", c); return 0; } add.c #include "add.h" int add(int a, int b) { return a + b; } add.h int add(int a, int b);
3.問題:如何保證一段C程式碼只會以C的方式被編譯?
解決方案:_cplusplus是C++編譯器內建的標準巨集定義
_cplusplus的意義:確保C程式碼以統一的C方式被編譯成目標檔案
課後練習:C呼叫C++函式
解決方案執行結果:
[email protected]:~/c++/9-2$ g++ main.cpp add.o
[email protected]:~/c++/9-2$ ./a.out
c = 3
[email protected]:~/c++/9-2$ gcc main.cpp add.o
[email protected]:~/c++/9-2$ ./a.out
c = 3
4.注意事項
C++編譯器不能以C的方式編譯過載函式
編譯方式決定函式名被編譯後的目標名
C++編譯方式將函式名和引數列表編譯成目標名
C編譯方式只將函式名作為目標名進行編譯
小結
函式過載是C++對C的一個重要升級
函式過載通過函式引數列表區分不同的同名函式
extern關鍵字能夠實現C和C++的相互呼叫
編譯方式決定符號表中的函式名的最終目標名
extern “C”{} 程式碼塊中不能包含函式過載