每天學習一點c 之二 函式的過載與啞元

2021-06-26 21:36:20 字數 2137 閱讀 9429

一、c++ 中的函式過載

先複習一點c語言中的記憶體拷貝函式,void* memcpy(char* dest,char* sor,size_t n),具體引數的含義見man手冊,

使用該函式必須匯入c語言標頭檔案,當然了在c++中要使用這個標頭檔案,就必須匯入形式的頭文

件(這不是廢話麼),以上的用法大家都很清楚。但是如果不導標頭檔案會出現什麼情況呢?這就是非常熟悉的未定

義錯誤,那麼如何解決呢?

2 假設我們寫了如下的c語言程式(math.c):

#includeint getmax(int x,int y)

int getmin(int x,int y)

3 使用gcc -c math.c的方式生成庫檔案(math.o檔案)。

4 現在我們要在c++程式中呼叫上述的c語言寫的庫檔案。編寫c++程式(callcfun.cpp)

#includeusing namespace std;

int main()

5 如果我們使用g++ callcfun.cpp math.o進行編譯和鏈結,就會報錯,getmax和getmin在此作用域未宣告,現在

我們在main函式之前進行宣告。

#includeusing namespace std;

int getmax(int x,int y);

int get min(int x,int y);

int main()

6 再次編譯鏈結,這時候又出現一條錯誤,找不到getmax和getmin的定義,這是為什麼呢?其實我們已經說過了,

就是c++編譯器在編譯生成函式名的時候會綜合引數列表資訊,而c編譯器則不會這樣做,所以在c++程式呼叫c程

序的時候,就會按照自己的習慣去找尋函式,這樣自然就找不到對應的函式了。那怎麼辦呢?這就需要我們告訴

編譯器要按照c的方式去找尋上述函式的定義。怎麼告訴編譯器呢,在每個函式宣告前加上extern "c",也可以批

量加,用大括號將兩個函式宣告括起來,然後在前面加上extern "c".

#includeusing namespace std;

extern "c"

int main()

7 這樣編譯就通過了,呼叫成功。

8 現在來總結一下函式過載,一共三點。

1)函式過載的概念:同一作用域裡面,函式名相同,引數列表不同,就構成函式過載。

2)函式過載的原理:這是因為c++編譯器在生成函式名的時候,會綜合引數列表的資訊。

3)函式過載的作用:第一,減少函式名稱的使用,第二,方便函式呼叫。

二、函式引數的啞元

1 如果乙個函式的引數只有型別,沒有名字,這就是啞元的概念。它的目的是讓函式引數嚴格匹配,保持函式向前

相容,以及區分函式。概念有些含糊吧?

你放心,我還有辦法解釋,就是舉例說明。假設有程式設計師開發出了乙個加密和解密的函式。

void encode(int key)

void decode(int key)

2 大家用的很開心,但是一段時間之後,這個開發人員辭職了,大家都知道,做軟體的人如果想漲工資,就得跳槽。

這個時候公司又來了乙個程式設計師,乙個更牛的程式設計師,又開發出了一套加密解密演算法,他覺得解密不用傳參

void encode(int key)

void decode()

3 但是公司裡面的人都習慣了前面的加密解密函式使用,那怎麼辦呢?這就是向前相容的問題。想必大家明白了向

前相容是怎麼回事了吧!

void encode(int key)

void decode(int)

4 對了,啞元怎麼區分函式呢?還是舉例說明。假設有date型別物件:

date date;

現在我們有如下需求

date++;

++date;

我們知道,要實現這樣的操作,就必須使用運算子過載。

operator++()

operator++()

有點暈了,到底那個是前++的運算子過載函式呢,畢竟前++和後++是有很大不同的,這個時候啞元就粉墨登場了

,用它來區分函式。

operator++() 就表示前++

operator++(int) 就表示後++

每天一點C (二)

最近一直被老大督促的在看pda開發這邊。今天就簡單說一下pda的 模擬器。安裝的軟體包 microsoft activesync 4.2 windows mobile 5.0 pocket pc sdk windows mobile 5.0 emulator images for pocket pc...

每天學習一點點(2023年二月)

2010 2 8號 星期一 1.決定記錄下每天學到的東西和感悟 3.看到乙個笑話 你屬什麼?我屬 於你。2010 2 9號 星期二2.如何更改vs2008的類和頁面的模板 1 找到c program files microsoft visual studio 9.0 common7 ide item...

C 繼承與建構函式一點說明

include using namespace std int i 1 class mycls void echo private int m nfir int m nsec int m nthd int m nfor int main 結果為 11析 如果為繼承的話,此為classmycls bc...