一、c++ 中的函式過載
先複習一點c語言中的記憶體拷貝函式,void* memcpy(char* dest,char* sor,size_t n),具體引數的含義見man手冊,
使用該函式必須匯入c語言標頭檔案,當然了在c++中要使用這個標頭檔案,就必須匯入形式的頭文
件(這不是廢話麼),以上的用法大家都很清楚。但是如果不導標頭檔案會出現什麼情況呢?這就是非常熟悉的未定
義錯誤,那麼如何解決呢?
2 假設我們寫了如下的c語言程式(math.c):6 再次編譯鏈結,這時候又出現一條錯誤,找不到getmax和getmin的定義,這是為什麼呢?其實我們已經說過了,#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()
就是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...