C 深度剖析學習總結 9 函式過載分析(二)

2021-10-01 11:28:38 字數 2463 閱讀 3797

【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 的含義,在日常生活中我們經常要清洗一些東西,比如洗車 洗衣服。儘管我們說話的時候並沒有明確地說用洗車的方式來洗車,或者用洗衣服 的方式來洗一件衣...