




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C++類(lèi)的定義與實(shí)現(xiàn)目錄一、類(lèi)的定義二、類(lèi)的實(shí)現(xiàn)1.成員函數(shù)2.內(nèi)聯(lián)函數(shù)文章轉(zhuǎn)自微信公眾號(hào):Coder梁(ID:Coder_LT)
一、類(lèi)的定義
根據(jù)C++Primer中的描述,類(lèi)的定義是一種將抽象轉(zhuǎn)換為用戶定義類(lèi)型的C++工具。也就是說(shuō)類(lèi)的實(shí)質(zhì)是一種用戶自定義類(lèi)型,它可以將數(shù)目表示和操作數(shù)據(jù)的方法組合成一個(gè)整潔的包。
在實(shí)際開(kāi)發(fā)當(dāng)中,想要實(shí)現(xiàn)一個(gè)類(lèi),并編寫(xiě)一個(gè)使用它的程序是相對(duì)比較復(fù)雜的,涉及多個(gè)步驟。
通常,我們會(huì)將類(lèi)的定義放在頭文件當(dāng)中,并將實(shí)現(xiàn)的代碼放在源代碼文件中。我們來(lái)看C++Primer當(dāng)中的一個(gè)例子:一個(gè)關(guān)于股票買(mǎi)賣(mài)的類(lèi)。
首先是類(lèi)的定義,寫(xiě)在stock00.h文件中:
#ifndefSTOCK00_H_
#defineSTOCK00_H_
#includestring
classStock{
private:
std::stringcompany;
longshares;
doubleshare_val;
doubletotal_val;
voidset_tot(){total_val=shares*share_val;}
public:
voidaccquire(conststd::stringco,longn,doublepr);
voidbuy(longnum,doubleprice);
voidsell(longnum,doubleprice);
voidupdate(doubleprice);
voidshow();
#endif
首先是關(guān)鍵字class,它表示我們聲明的是一個(gè)類(lèi),一般類(lèi)名我們使用大駝峰命名法定義。
其次在這個(gè)類(lèi)的定義當(dāng)中,我們看到了兩個(gè)新出現(xiàn)的關(guān)鍵字private和public。這兩個(gè)關(guān)鍵字描述了對(duì)類(lèi)成員的訪問(wèn)控制,使用類(lèi)對(duì)象的程序,都可以直接訪問(wèn)公有部分(public),但無(wú)法訪問(wèn)對(duì)象的私有成員。
想要獲取私有成員,只能通過(guò)公有的成員函數(shù)。比如在上面這個(gè)例子當(dāng)中,我們想要修改share_val只能通過(guò)公有的方法sell或buy,而無(wú)法直接對(duì)變量的值進(jìn)行修改。防止程序直接訪問(wèn)數(shù)據(jù)修改數(shù)據(jù)被稱(chēng)為數(shù)據(jù)隱藏。
除了public和private,C++當(dāng)中還提供了第三個(gè)關(guān)鍵字叫做protected,這個(gè)關(guān)鍵字和類(lèi)的繼承有關(guān),我們將會(huì)在之后的文章當(dāng)中進(jìn)行討論。
數(shù)據(jù)隱藏的思想其實(shí)是認(rèn)為類(lèi)中的成員變量的所有權(quán)應(yīng)該屬于類(lèi)本身,當(dāng)我們需要對(duì)類(lèi)中的數(shù)據(jù)進(jìn)行讀取和修改的時(shí)候,應(yīng)當(dāng)通過(guò)類(lèi)提供的公開(kāi)方法,而不是直接操作類(lèi)中值。這被認(rèn)為是一種面向?qū)ο蟮乃枷?,即只能通過(guò)類(lèi)提供的方法訪問(wèn)數(shù)據(jù),而不應(yīng)該直接訪問(wèn)數(shù)據(jù)。
C++正是基于這種面向?qū)ο蟮乃枷朐O(shè)計(jì)的,所以類(lèi)中的成員默認(rèn)是private的,我們可以省去private關(guān)鍵字:
classWorld{
floatmass;
charname[30];
public:
voidtellall();
...
};
我們從類(lèi)的描述看上去很像是包含了成員函數(shù)以及數(shù)據(jù)隱藏的結(jié)構(gòu)體,但實(shí)際上這是因?yàn)镃++對(duì)結(jié)構(gòu)體進(jìn)行了拓展,讓它具有了和類(lèi)相同的特性。在C語(yǔ)言當(dāng)中,結(jié)構(gòu)體是沒(méi)有這么多特性的。
比如我們可以給結(jié)構(gòu)體設(shè)計(jì)構(gòu)造函數(shù),也可以給結(jié)構(gòu)體添加成員函數(shù),甚至結(jié)構(gòu)體也可以繼承、派生和多態(tài)。
它們之間唯一的區(qū)別是,結(jié)構(gòu)體的默認(rèn)類(lèi)型是public,而類(lèi)是private。所以通常使用類(lèi)來(lái)實(shí)現(xiàn)對(duì)象,而結(jié)構(gòu)體只用來(lái)結(jié)構(gòu)化地存儲(chǔ)數(shù)據(jù)。
另外多說(shuō)一句,數(shù)據(jù)隱藏的面向?qū)ο罄砟畈⒉贿m用于所有語(yǔ)言。比如Python,Python當(dāng)中的類(lèi)中的成員變量默認(rèn)是public,且沒(méi)有private關(guān)鍵字。
二、類(lèi)的實(shí)現(xiàn)
當(dāng)我們完成了類(lèi)定義之后,還需要來(lái)實(shí)現(xiàn)類(lèi)當(dāng)中的函數(shù)。
比如我們?cè)趕tock00.h當(dāng)中定義了一個(gè)類(lèi):
#ifndefSTOCK00_H_
#defineSTOCK00_H_
#includestring
classStock{
private:
std::stringcompany;
longshares;
doubleshare_val;
doubletotal_val;
voidset_tot(){total_val=shares*share_val;}
public:
voidaccquire(conststd::stringco,longn,doublepr);
voidbuy(longnum,doubleprice);
voidsell(longnum,doubleprice);
voidupdate(doubleprice);
voidshow();
#endif
1.成員函數(shù)
在這個(gè)定義當(dāng)中,我們只是聲明了函數(shù),并沒(méi)有具體實(shí)現(xiàn)函數(shù)的邏輯。
我們通常會(huì)在同名的cpp文件當(dāng)中實(shí)現(xiàn),實(shí)現(xiàn)的時(shí)候,需要使用作用域解析運(yùn)算符來(lái)表示函數(shù)所屬的類(lèi):
voidStock::update(doubleprice){
...
}
這樣就表明了update函數(shù)所屬Stock這個(gè)類(lèi),這也就意味著我們可以創(chuàng)建屬于其他類(lèi)的同名函數(shù):
voidBuffoon::update(){
...
}
其次,我們?cè)诔蓡T函數(shù)當(dāng)中,可以訪問(wèn)private限定的成員變量。比如說(shuō)在show函數(shù)當(dāng)中,我們可以這樣實(shí)現(xiàn):
voidStock::show(){
std::coutcompanysharesshare_valtotal_valendl;
}
雖然company,shares都是類(lèi)的私有成員,但在成員方法當(dāng)中,一樣可以正常訪問(wèn)。
再次,我們?cè)诔蓡T方法當(dāng)中調(diào)用另外一個(gè)成員方法,可以不需要解析運(yùn)算符。比如我們要在show函數(shù)內(nèi)調(diào)用update函數(shù),直接使用update()即可,而無(wú)需前面的Stock::。
2.內(nèi)聯(lián)函數(shù)
我們?cè)倩剡^(guò)頭來(lái)看一下Stock這個(gè)類(lèi)的定義,在類(lèi)的定義當(dāng)中,有一個(gè)叫做set_tot的函數(shù)。我們直接在類(lèi)當(dāng)中實(shí)現(xiàn)了邏輯。雖然同樣是成員函數(shù),但是在類(lèi)當(dāng)中直接實(shí)現(xiàn)的函數(shù)是有所區(qū)別的。在類(lèi)聲明當(dāng)中實(shí)現(xiàn)的函數(shù),會(huì)被視為是內(nèi)聯(lián)函數(shù)。
一般我們會(huì)把一些比較簡(jiǎn)短的函數(shù)在類(lèi)的聲明當(dāng)中直接實(shí)現(xiàn),當(dāng)然我們也可以使用關(guān)鍵字inline,手
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CAS 907-2024面向分布式天然氣供應(yīng)的智能化系統(tǒng)技術(shù)要求
- T/CCOA 76-2023濃香核桃油
- 北京市消費(fèi)類(lèi)預(yù)付費(fèi)服務(wù)交易合同行為指引(試行)(標(biāo)準(zhǔn)版)5篇
- 有關(guān)印刷品訂貨合同7篇
- 專(zhuān)業(yè)版抵押房子借款協(xié)議8篇
- T/ZRCX 004-2018集成灶
- 眼科疾病常用穴位
- T/ZHCA 105-2022靈芝子實(shí)體
- 癲癇預(yù)防與急救
- 健康促進(jìn)單位創(chuàng)建課件
- 卵圓孔未閉的治療及護(hù)理
- 高考語(yǔ)文備考復(fù)習(xí):現(xiàn)代文閱讀-科幻小說(shuō)閱讀指導(dǎo)與練習(xí)
- MOOC 兒科學(xué)-四川大學(xué) 中國(guó)大學(xué)慕課答案
- 運(yùn)政業(yè)務(wù)培訓(xùn)課件
- 《義務(wù)教育道德與法治課程標(biāo)準(zhǔn)(2022年版)》
- 糧油保管員中級(jí)培訓(xùn)測(cè)試題及標(biāo)準(zhǔn)答案
- 房屋建筑和市政基礎(chǔ)設(shè)施工程竣工驗(yàn)收
- 腰椎椎管狹窄的護(hù)理查房
- 頂管定向鉆施工方案
- 創(chuàng)傷失血性休克中國(guó)急診專(zhuān)家共識(shí)(2023)解讀
- 中廣核研究院熱室設(shè)施建設(shè)項(xiàng)目 環(huán)境影響報(bào)告書(shū)(建造階段)
評(píng)論
0/150
提交評(píng)論