定義抽象數(shù)據(jù)類型

在 C++ 中,使用類定義自己的數(shù)據(jù)類型。

通過定義新的類型來反映待解決問題中的各種概念掌唾,可以使我們更容易編寫半夷、調(diào)試、修改程序。

類的基本思想使數(shù)據(jù)抽象和封裝。

數(shù)據(jù)抽象是一種依賴于接口和實(shí)現(xiàn)分離的編程技術(shù)。

類接口包括用戶所能執(zhí)行的操作际乘。類的實(shí)現(xiàn)則包括類的數(shù)據(jù)成員、負(fù)責(zé)接口實(shí)現(xiàn)的函數(shù)體以及定義類所需的各種私有函數(shù)漂佩。

封裝實(shí)現(xiàn)了類的接口和實(shí)現(xiàn)的分離脖含。封裝后的類隱藏了它的實(shí)現(xiàn)細(xì)節(jié)。用戶只能使用接口而無法訪問實(shí)現(xiàn)部分投蝉。

類想要實(shí)現(xiàn)數(shù)據(jù)抽象和封裝养葵,需要定義一個(gè)抽象數(shù)據(jù)類型,在抽象數(shù)據(jù)類型中瘩缆,由類的設(shè)計(jì)者負(fù)責(zé)考慮類的實(shí)現(xiàn)過程关拒。使用該類的程序員則只需要抽象地思考類型做了什么,無需了解類型的工作細(xì)節(jié)庸娱。

在第一章使用的 Sales_item 類是一個(gè)抽象數(shù)據(jù)類型着绊,可以通過它的接口來使用一個(gè) Sales_item 對(duì)象。 我們不能訪問 Sales_item 對(duì)象的數(shù)據(jù)成員熟尉,也根本不知道這個(gè)類有哪些數(shù)據(jù)成員归露。

Sales_data 類不是一個(gè)抽象數(shù)據(jù)類型。它允許類的用戶直接訪問它的數(shù)據(jù)成員并要求由用戶來編寫操作斤儿。若想把 Sales_data變成抽象數(shù)據(jù)類型剧包,需要定義一些操作以供類的用戶使用。一旦 Sales_data 定義了它自己的操作往果,就可以封裝它的數(shù)據(jù)成員了疆液。

最終目的是令 Sales_data 支持與 Sales_item 類完全一樣的操作集合。

Sales_item 類有名為 isbn 的成員函數(shù)陕贮。且支持 +堕油、=、+=、<<馍迄、>>運(yùn)算符福也。

Sales_data 的接口應(yīng)該包含以下操作
使用 Sales_data 完成書店程序

再賦予 Sales_data 一個(gè)除 combine 和 isbn 外的另一個(gè)成員函數(shù) avg_price 用于返回售出書記的平均價(jià)格。因?yàn)槠洳⒎峭ㄓ门嗜Γ运鼞?yīng)該屬于類的實(shí)現(xiàn)的一部分,而非接口的一部分峦甩。

定義和聲明成員函數(shù)的方法與普通函數(shù)差不多赘来。成員函數(shù)的聲明必須在類的內(nèi)部,它的定義則既可以在類的內(nèi)部也可以在類的外部凯傲。作為接口組成部分而非成員函數(shù)犬辰。

改進(jìn)的 Sales_data

盡管所有成員都必須在類的內(nèi)部聲明,但是成員函數(shù)體可以定義在類內(nèi)也可以定義在類外冰单。

isbn 函數(shù)幌缝,它的參數(shù)列表為空,返回值是一個(gè) string 對(duì)象:

string 函數(shù)

成員函數(shù)體是一個(gè)塊诫欠,塊中只有一條 return 語句涵卵,用于返回 Sales_data 對(duì)象的 bookNo 數(shù)據(jù)成員。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

我們使用了點(diǎn)運(yùn)算符來訪問 total 對(duì)象的 isbn? ? 成員荒叼,然后調(diào)用它轿偎。 total.isbn

成員函數(shù)通過一個(gè)名為 this 的額外隱式參數(shù)來訪問調(diào)用它的那個(gè)對(duì)象。當(dāng)調(diào)用一個(gè)成員函數(shù)時(shí)被廓,用請(qǐng)求該函數(shù)的對(duì)象地址初始化 this 坏晦。

調(diào)用函數(shù)

可以將 isbn 定義成:std::string isbn() const {return this -> bookNo;}

因?yàn)?this 的目的總是指向 這個(gè) 對(duì)象,所以是一個(gè)常量指針嫁乘,不允許改成其保存的地址昆婿。

Isbn函數(shù)的另一個(gè)關(guān)鍵是緊隨參數(shù)列表之后的 const 關(guān)鍵字,在這里 const 的作用是修改隱式 this 指針的類型蜓斧。

默認(rèn)情況 this 的類型是指向類類型非常量版本的常量指針仓蛆。所以我們不能在一個(gè)常量對(duì)象上調(diào)用普通的成員函數(shù)。

把 const 關(guān)鍵字放在成員函數(shù)的參數(shù)列表之后法精,這樣使用 const 的成員函數(shù)被稱作常量成員函數(shù)多律。

isbn 的函數(shù)體

this 是指向常量的指針,所以常量成員函數(shù)不能改變調(diào)用它的對(duì)象內(nèi)容搂蜓。

常量對(duì)象狼荞、常量對(duì)象的引用或指針都只能調(diào)用常量成員函數(shù)。

類本身就是一個(gè)作用域帮碰,類的成員函數(shù)的定義嵌套在類的作用域內(nèi)相味。isbn 中用到的名字 bookNo 就是定義在 Sales_data 內(nèi)的數(shù)據(jù)成員。

即使 bookNo 定義在 isbn 之后殉挽,isbn 還是能夠使用 bookNo 丰涉。?

編譯器分兩步處理類:首先編譯成員的聲明拓巧,之后才輪到成員函數(shù)體。所以成員函數(shù)體可以任意使用類中的其它成員且無須在意這些成員出現(xiàn)的次序一死。

在類的外部定義成員函數(shù)時(shí)肛度,成員函數(shù)的定義必須與它的聲明匹配。返回類型投慈、參數(shù)列表承耿、函數(shù)名都與類內(nèi)部的聲明保持一致。

函數(shù) avg_price ()

avg_price 函數(shù)被聲明在類 Sales_data 的作用域內(nèi)伪煤。一旦編譯器看到這個(gè)函數(shù)名加袋,就能理解剩余的代碼是位于類的作用域內(nèi)的。

所以當(dāng)?avg_price 使用 revenue 抱既、units_sold 時(shí)职烧,實(shí)際它隱式地使用了 Sales_data 的成員。

函數(shù) combine 類似于復(fù)合運(yùn)算賦值運(yùn)算符 += 防泵。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蚀之,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子择克,更是在濱河造成了極大的恐慌恬总,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肚邢,死亡現(xiàn)場(chǎng)離奇詭異壹堰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)骡湖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門贱纠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人响蕴,你說我怎么就攤上這事谆焊。” “怎么了浦夷?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵辖试,是天一觀的道長。 經(jīng)常有香客問我劈狐,道長罐孝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任肥缔,我火速辦了婚禮莲兢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己改艇,他們只是感情好收班,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谒兄,像睡著了一般摔桦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舵变,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天酣溃,我揣著相機(jī)與錄音,去河邊找鬼纪隙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛扛或,可吹牛的內(nèi)容都是我干的绵咱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼熙兔,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼悲伶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起住涉,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤麸锉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后舆声,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體花沉,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年媳握,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碱屁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛾找,死狀恐怖娩脾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情打毛,我是刑警寧澤柿赊,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站幻枉,受9級(jí)特大地震影響碰声,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜展辞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一奥邮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦洽腺、人聲如沸脚粟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽核无。三九已至,卻和暖如春藕坯,著一層夾襖步出監(jiān)牢的瞬間团南,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國打工炼彪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吐根,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓辐马,卻偏偏與公主長得像拷橘,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喜爷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容