【c++深度剖析學習總結】 9 函式過載分析(二)
1.過載與指標
下面的函式指標將儲存哪個函式的位址?第乙個
函式過載遇上函式指標
將過載函式名賦值給函式指標時
1.根據過載規則挑選與函式指標引數列表一致的候選者
2.嚴格匹配候選者的函式型別與函式指標的函式型別
9-1 函式過載vs函式指標
#include
#include
intfunc
(int x)
intfunc
(int a,
int b)
intfunc
(const
char
* s)
typedef
int(
*pfunc)
(int a)
;int
main
(int argc,
char
*ar**)
執行結果
注意
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
#ifdef __cplusplus
extern
"c"#endif
intmain()
add.c
#include
"add.h"
intadd
(int a,
int b)
add.h
int
add(
int a,
int b)
;
執行結果:
3.問題:如何保證一段c**只會以c的方式被編譯?
解決方案:_cplusplus是c++編譯器內建的標準巨集定義
_cplusplus的意義:確保c**以統一的c方式被編譯成目標檔案
課後練習:c呼叫c++函式
解決方案執行結果:
lkk@lkk-
virtual
-machine:
~/c++/9
-2$ g++ main.cpp add.o
lkk@lkk-
virtual
-machine:
~/c++/9
-2$ .
/a.out
c =3
lkk@lkk-
virtual
-machine:
~/c++/9
-2$ gcc main.cpp add.o
lkk@lkk-
virtual
-machine:
~/c++/9
-2$ .
/a.out
c =3
4.注意事項c++編譯器不能以c的方式編譯過載函式
編譯方式決定函式名被編譯後的目標名
c++編譯方式將函式名和引數列表編譯成目標名
c編譯方式只將函式名作為目標名進行編譯
小結
函式過載是c++對c的乙個重要公升級
函式過載通過函式引數列表區分不同的同名函式
extern關鍵字能夠實現c和c++的相互呼叫
編譯方式決定符號表中的函式名的最終目標名
extern 「c」{} **塊中不能包含函式過載
《C 深度剖析》學習日誌六 函式過載(下)
這段 該呼叫哪乙個函式呢?函式過載遇上函式指標 將過載函式名賦值給函式指標時 1.根據過載規則挑選與函式指標引數列表一致的候選者 2.嚴格匹配候選者的函式型別與函式指標的函式型別 函式過載必然發生在同乙個作用域中 編譯器需要用引數列表或引數型別進行函式選擇 無法直接通過函式名得到過載函式的入口位址 ...
C 深度剖析學習總結 6 內聯函式分析
c 深度剖析學習總結 6 內聯函式分析 1.c 中的const常量可以替代巨集常數定義,如 const int a 3 define a 3 c 中是否有解決方案替代巨集 片段呢?有,內聯函式 2.內聯函式 c 中推薦使用內聯函式替代巨集 片段 c 中使用inline關鍵字宣告內聯函式 inline...
C 過載,覆蓋與隱藏深度剖析
overload 翻譯過來就是 超載,過載,過載,超出標準負荷 override 翻譯過來是 重置,覆蓋,使原來的失去效果。先來說說過載 overload 的含義,在日常生活中我們經常要清洗一些東西,比如洗車 洗衣服。儘管我們說話的時候並沒有明確地說用洗車的方式來洗車,或者用洗衣服 的方式來洗一件衣...