C++類的定義與實(shí)現(xiàn)
文章轉(zhuǎn)自 微信公眾號(hào):Coder梁(ID:Coder_LT)
一、類的定義
根據(jù)C++ Primer
中的描述,類的定義是一種將抽象轉(zhuǎn)換為用戶定義類型的C++工具。也就是說(shuō)類的實(shí)質(zhì)是一種用戶自定義類型,它可以將數(shù)目表示和操作數(shù)據(jù)的方法組合成一個(gè)整潔的包。
在實(shí)際開(kāi)發(fā)當(dāng)中,想要實(shí)現(xiàn)一個(gè)類,并編寫一個(gè)使用它的程序是相對(duì)比較復(fù)雜的,涉及多個(gè)步驟。
通常,我們會(huì)將類的定義放在頭文件當(dāng)中,并將實(shí)現(xiàn)的代碼放在源代碼文件中。我們來(lái)看C++ Primer
當(dāng)中的一個(gè)例子:一個(gè)關(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
,它表示我們聲明的是一個(gè)類,一般類名我們使用大駝峰命名法定義。
其次在這個(gè)類的定義當(dāng)中,我們看到了兩個(gè)新出現(xiàn)的關(guān)鍵字private
和public
。這兩個(gè)關(guān)鍵字描述了對(duì)類成員的訪問(wèn)控制,使用類對(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ù)被稱為數(shù)據(jù)隱藏。
除了public
和private
,C++當(dāng)中還提供了第三個(gè)關(guān)鍵字叫做protected
,這個(gè)關(guān)鍵字和類的繼承有關(guān),我們將會(huì)在之后的文章當(dāng)中進(jìn)行討論。
數(shù)據(jù)隱藏的思想其實(shí)是認(rèn)為類中的成員變量的所有權(quán)應(yīng)該屬于類本身,當(dāng)我們需要對(duì)類中的數(shù)據(jù)進(jìn)行讀取和修改的時(shí)候,應(yīng)當(dāng)通過(guò)類提供的公開(kāi)方法,而不是直接操作類中值。這被認(rèn)為是一種面向?qū)ο蟮乃枷?,即只能通過(guò)類提供的方法訪問(wèn)數(shù)據(jù),而不應(yīng)該直接訪問(wèn)數(shù)據(jù)。
C++正是基于這種面向?qū)ο蟮乃枷朐O(shè)計(jì)的,所以類中的成員默認(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)镃++對(duì)結(jié)構(gòu)體進(jìn)行了拓展,讓它具有了和類相同的特性。在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)類型是public
,而類是private
。所以通常使用類來(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)中的類中的成員變量默認(rèn)是public,且沒(méi)有private
關(guān)鍵字。
二、類的實(shí)現(xiàn)
當(dāng)我們完成了類定義之后, 還需要來(lái)實(shí)現(xiàn)類當(dāng)中的函數(shù)。
比如我們?cè)趕tock00.h當(dāng)中定義了一個(gè)類:
#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
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ù)所屬的類:
void Stock::update(double price) { ? ? ... }
這樣就表明了update
函數(shù)所屬Stock
這個(gè)類,這也就意味著我們可以創(chuàng)建屬于其他類的同名函數(shù):
void Buffoon::update() { ? ? ... }
其次,我們?cè)诔蓡T函數(shù)當(dāng)中,可以訪問(wèn)private
限定的成員變量。比如說(shuō)在show
函數(shù)當(dāng)中,我們可以這樣實(shí)現(xiàn):
void Stock::show() { ? ? std::cout << company << shares << share_val << total_val << endl; }
雖然company
,shares
都是類的私有成員,但在成員方法當(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è)類的定義,在類的定義當(dāng)中,有一個(gè)叫做set_tot
的函數(shù)。我們直接在類當(dāng)中實(shí)現(xiàn)了邏輯。雖然同樣是成員函數(shù),但是在類當(dāng)中直接實(shí)現(xiàn)的函數(shù)是有所區(qū)別的。在類聲明當(dāng)中實(shí)現(xiàn)的函數(shù),會(huì)被視為是內(nèi)聯(lián)函數(shù)。
一般我們會(huì)把一些比較簡(jiǎn)短的函數(shù)在類的聲明當(dāng)中直接實(shí)現(xiàn),當(dāng)然我們也可以使用關(guān)鍵字inline
,手動(dòng)指定某個(gè)函數(shù)是內(nèi)聯(lián)的。
class Stock { ? ? private: ? ? void set_tot(); ? ? public: ? ? ... }; inline void Stock::set_tot() { ? ? total_val = shares * share_val; }
到此這篇關(guān)于C++類的定義與實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C++類的定義與實(shí)現(xiàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
QT實(shí)現(xiàn)自定義Http客戶端的示例代碼
這篇文章主要為大家詳細(xì)介紹了QT如何實(shí)現(xiàn)自定義Http客戶端的,可以實(shí)現(xiàn)支持get,post請(qǐng)求方式;支持連接超時(shí)處理;支持網(wǎng)絡(luò)錯(cuò)誤,嘗試重連等功能,感興趣的小伙伴可以學(xué)習(xí)一下2022-11-11C++ 11 std::function和std::bind使用詳解
這篇文章主要介紹了C++ 11 std::function和std::bind使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02Mac OS X 10.8 中編譯APUE(Unix環(huán)境高級(jí)編程)的源代碼過(guò)程
這篇文章主要介紹了Mac OS X 10.8 中編譯APUE(Unix環(huán)境高級(jí)編程)的源代碼過(guò)程,對(duì)于用MAC學(xué)習(xí)Unix環(huán)境高級(jí)編程的同學(xué)會(huì)有些作用,需要的朋友可以參考下2014-09-09C語(yǔ)言中對(duì)字母進(jìn)行大小寫轉(zhuǎn)換的簡(jiǎn)單方法
這篇文章主要介紹了C語(yǔ)言中對(duì)字母進(jìn)行大小寫轉(zhuǎn)換的簡(jiǎn)單方法,是C語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08C++實(shí)現(xiàn)LeetCode(51.N皇后問(wèn)題)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(51.N皇后問(wèn)題),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07Qt實(shí)現(xiàn)驗(yàn)證碼相關(guān)功能的代碼示例
驗(yàn)證碼的原理基于人類視覺(jué)和計(jì)算機(jī)視覺(jué)的差異性,通過(guò)給用戶顯示一些難以被機(jī)器識(shí)別的圖形或文字,讓用戶進(jìn)行人機(jī)交互,確認(rèn)自己的身份,這樣可以有效保護(hù)網(wǎng)站安全,所以本給大家介紹了Qt實(shí)現(xiàn)驗(yàn)證碼相關(guān)功能的代碼示例,感興趣的朋友可以參考下2024-01-01解決C++ 無(wú)法從void 轉(zhuǎn)換為L(zhǎng)RESULT的方法詳解
本篇文章是對(duì)C++中無(wú)法從void轉(zhuǎn)換為L(zhǎng)RESULT的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05