您好,登錄后才能下訂單哦!
這篇文章主要講解了“C++類的定義與實(shí)現(xiàn)方法是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C++類的定義與實(shí)現(xiàn)方法是什么”吧!
根據(jù)C++ Primer
中的描述,類的定義是一種將抽象轉(zhuǎn)換為用戶定義類型的C++工具。也就是說類的實(shí)質(zhì)是一種用戶自定義類型,它可以將數(shù)目表示和操作數(shù)據(jù)的方法組合成一個整潔的包。
在實(shí)際開發(fā)當(dāng)中,想要實(shí)現(xiàn)一個類,并編寫一個使用它的程序是相對比較復(fù)雜的,涉及多個步驟。
通常,我們會將類的定義放在頭文件當(dāng)中,并將實(shí)現(xiàn)的代碼放在源代碼文件中。我們來看C++ Primer
當(dāng)中的一個例子:一個關(guān)于股票買賣的類。
首先是類的定義,寫在stock00.h文件中:
#ifndef STOCK00_H_ #define STOCK00_H_ #include <string> class Stock { private: std::string company; long shares; double share_val; double total_val; void set_tot() {total_val = shares * share_val;} public: void accquire(const std::string &co, long n, double pr); void buy(long num, double price); void sell(long num, double price); void update(double price); void show(); }; #endif
首先是關(guān)鍵字class
,它表示我們聲明的是一個類,一般類名我們使用大駝峰命名法定義。
其次在這個類的定義當(dāng)中,我們看到了兩個新出現(xiàn)的關(guān)鍵字private
和public
。這兩個關(guān)鍵字描述了對類成員的訪問控制,使用類對象的程序,都可以直接訪問公有部分(public
),但無法訪問對象的私有成員。
想要獲取私有成員,只能通過公有的成員函數(shù)。比如在上面這個例子當(dāng)中,我們想要修改share_val
只能通過公有的方法sell
或buy
,而無法直接對變量的值進(jìn)行修改。防止程序直接訪問數(shù)據(jù)修改數(shù)據(jù)被稱為數(shù)據(jù)隱藏。
除了public
和private
,C++當(dāng)中還提供了第三個關(guān)鍵字叫做protected
,這個關(guān)鍵字和類的繼承有關(guān),我們將會在之后的文章當(dāng)中進(jìn)行討論。
數(shù)據(jù)隱藏的思想其實(shí)是認(rèn)為類中的成員變量的所有權(quán)應(yīng)該屬于類本身,當(dāng)我們需要對類中的數(shù)據(jù)進(jìn)行讀取和修改的時候,應(yīng)當(dāng)通過類提供的公開方法,而不是直接操作類中值。這被認(rèn)為是一種面向?qū)ο蟮乃枷耄粗荒芡ㄟ^類提供的方法訪問數(shù)據(jù),而不應(yīng)該直接訪問數(shù)據(jù)。
C++正是基于這種面向?qū)ο蟮乃枷朐O(shè)計的,所以類中的成員默認(rèn)是private的,我們可以省去private關(guān)鍵字:
class World { float mass; char name[30]; public: void tellall(); ... };
我們從類的描述看上去很像是包含了成員函數(shù)以及數(shù)據(jù)隱藏的結(jié)構(gòu)體,但實(shí)際上這是因?yàn)镃++對結(jié)構(gòu)體進(jìn)行了拓展,讓它具有了和類相同的特性。在C語言當(dāng)中,結(jié)構(gòu)體是沒有這么多特性的。
比如我們可以給結(jié)構(gòu)體設(shè)計構(gòu)造函數(shù),也可以給結(jié)構(gòu)體添加成員函數(shù),甚至結(jié)構(gòu)體也可以繼承、派生和多態(tài)。
它們之間唯一的區(qū)別是,結(jié)構(gòu)體的默認(rèn)類型是public
,而類是private
。所以通常使用類來實(shí)現(xiàn)對象,而結(jié)構(gòu)體只用來結(jié)構(gòu)化地存儲數(shù)據(jù)。
另外多說一句,數(shù)據(jù)隱藏的面向?qū)ο罄砟畈⒉贿m用于所有語言。比如Python,Python當(dāng)中的類中的成員變量默認(rèn)是public,且沒有private
關(guān)鍵字。
當(dāng)我們完成了類定義之后, 還需要來實(shí)現(xiàn)類當(dāng)中的函數(shù)。
比如我們在stock00.h當(dāng)中定義了一個類:
#ifndef STOCK00_H_ #define STOCK00_H_ #include <string> class Stock { private: std::string company; long shares; double share_val; double total_val; void set_tot() {total_val = shares * share_val;} public: void accquire(const std::string &co, long n, double pr); void buy(long num, double price); void sell(long num, double price); void update(double price); void show(); }; #endif
在這個定義當(dāng)中,我們只是聲明了函數(shù),并沒有具體實(shí)現(xiàn)函數(shù)的邏輯。
我們通常會在同名的cpp
文件當(dāng)中實(shí)現(xiàn),實(shí)現(xiàn)的時候,需要使用作用域解析運(yùn)算符來表示函數(shù)所屬的類:
void Stock::update(double price) { ... }
這樣就表明了update
函數(shù)所屬Stock
這個類,這也就意味著我們可以創(chuàng)建屬于其他類的同名函數(shù):
void Buffoon::update() { ... }
其次,我們在成員函數(shù)當(dāng)中,可以訪問private
限定的成員變量。比如說在show
函數(shù)當(dāng)中,我們可以這樣實(shí)現(xiàn):
void Stock::show() { std::cout << company << shares << share_val << total_val << endl; }
雖然company
,shares
都是類的私有成員,但在成員方法當(dāng)中,一樣可以正常訪問。
再次,我們在成員方法當(dāng)中調(diào)用另外一個成員方法,可以不需要解析運(yùn)算符。比如我們要在show函數(shù)內(nèi)調(diào)用update
函數(shù),直接使用update()
即可,而無需前面的Stock::。
我們再回過頭來看一下Stock
這個類的定義,在類的定義當(dāng)中,有一個叫做set_tot
的函數(shù)。我們直接在類當(dāng)中實(shí)現(xiàn)了邏輯。雖然同樣是成員函數(shù),但是在類當(dāng)中直接實(shí)現(xiàn)的函數(shù)是有所區(qū)別的。在類聲明當(dāng)中實(shí)現(xiàn)的函數(shù),會被視為是內(nèi)聯(lián)函數(shù)。
一般我們會把一些比較簡短的函數(shù)在類的聲明當(dāng)中直接實(shí)現(xiàn),當(dāng)然我們也可以使用關(guān)鍵字inline
,手動指定某個函數(shù)是內(nèi)聯(lián)的。
class Stock { private: void set_tot(); public: ... }; inline void Stock::set_tot() { total_val = shares * share_val; }
感謝各位的閱讀,以上就是“C++類的定義與實(shí)現(xiàn)方法是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對C++類的定義與實(shí)現(xiàn)方法是什么這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。