1. 程式人生 > >C++筆記 第九課 函式過載分析(下)---狄泰學院

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”{} 程式碼塊中不能包含函式過載