日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

7.1.2 定义改进的Sales_date类

發(fā)布時間:2024/4/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 7.1.2 定义改进的Sales_date类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?? 改進(jìn)后的類的數(shù)據(jù)成員將與之前定義的版本保持一致,它們包括:bookNO,string類型,表示ISBN編號;units_sold,unsigned類型,表示某本書的銷量;以及revenue,double類型,表示這本書的總銷售收入。

???????? 如前所述,我們的類將包含兩個成員函數(shù):combine和isbn。此外,我們還將賦予Sales_date另一個成員函數(shù)用于返回售出書籍的平均價格,這個函數(shù)被命名為avg_price。因?yàn)閍vg_price的目的并非通用,所以它應(yīng)該屬于類的實(shí)現(xiàn)的一部分,而非接口的一部分。

??????? 定義和聲明成員函數(shù)的方式與普通函數(shù)差不多。成員函數(shù)的聲明必須在類的內(nèi)部,它的定義則可以在類的內(nèi)部也可以在類的外部。作為接口組成部分的非成員函數(shù),例如add、read和print等,它們的定義和聲明都在類的外部。

???????由此可知,改進(jìn)的Sales_data類型應(yīng)該如下所示:

struct Sales_data{// 新成員:關(guān)于Sales_data對象的操作std :: string isbn() const { return bookNo; }Sales_data & combine(const Sales_data&);double avg_price() const;// 數(shù)據(jù)成員相之前沒有變化sd :: string bookNo;unsigned units_sold = 0;double revenue = 0.0; }; // Sales_data的非成員接口函數(shù) Sales_data add(const Sales_data&, const Sales_data&); std :: ostream &print(std :: ostream&, const Sales_data&); std :: istream &read(std :: istream, Sales_data&);

注:定義在類的內(nèi)部的函數(shù)是隱式的inline函數(shù)。
定義成員函數(shù)

????????盡管所有成員都必須在內(nèi)部聲明,但是成員函數(shù)體可以定義在類內(nèi)也可以定義在類外。對于Sales_data類來說,isbn函數(shù)定義在了類內(nèi),而combine和avg_price定義在了類外。

???????我們首先介紹isbn函數(shù),它的形參列表為空,返回值是一個string對象:

????????std :: string isbn( )?? const { return bookNo; }

和其他函數(shù)一樣,成員函數(shù)體也是一個語句快。在此例中只有一條return語句,用于返回Sales_data對象的bookNo數(shù)據(jù)成員。關(guān)于isbn函數(shù)一間很有意思的事情是:它是如何獲得bookNo成員所依賴的對象呢?

引入this

????????讓我們再一次觀察對isbn成員函數(shù)的調(diào)用:

????????total.isbn( )

在這里,我們使用了點(diǎn)運(yùn)算符來訪問total對象的isbn成員,然后調(diào)用它。

????????在后面我們將介紹一種例外的形式,當(dāng)我們調(diào)用成員函數(shù)時,實(shí)際上是在替某個對象調(diào)用它。如果isbn指向Sales_data的成員(例如bookNo),則它隱式地指向調(diào)用該函數(shù)的對象的成員。在上面所示的調(diào)用中,當(dāng)isbn返回bookNo時,實(shí)際上它隱式地返回total.bookNo。

????????成員函數(shù)通過一個名為this的額外的隱式的參數(shù)來訪問調(diào)用它的那個對象。當(dāng)我們調(diào)用一個成員函數(shù)時,用請求該函數(shù)的對象地址初始化this。例如,如果調(diào)用

??????? total.isbn( )

則編譯器負(fù)責(zé)把total的地址傳遞給isbn的隱式形參this,可以等價地認(rèn)為編譯器將該調(diào)用重寫成了如下的形式:

??????? //?偽代碼,用于說明調(diào)用成員函數(shù)的實(shí)際執(zhí)行過程

????????Sales_data :: isbn(&total)

其中,調(diào)用Sales_data的isbn成員時傳入了對象total的地址。

????????在成員函數(shù)內(nèi)部,我們可以直接使用調(diào)用該函數(shù)的對象的成員,而無須通過成員訪問運(yùn)算符做到這一點(diǎn),因?yàn)閠his所指的正是這個對象。任何對類成員的直接訪問都被看作this的隱式引用,也就是說,當(dāng)isbn使用bookNo時,它隱式地使用this指向的成員,就像我們書寫了this->bookNo一樣。

????????對于我們來說,this形參是隱式定義的。實(shí)際上,任何自定義名為this的參數(shù)或變量的行為都是非法的。我們可以在成員函數(shù)體內(nèi)部使用this,因此盡管沒必要,但我們還是能夠把isbn定義成如下的形式:

??????? std :: string isbn( )? const? { return this ->bookNo; }

????????因?yàn)閠his的目的總是指向“這個”對象,所以this是一個常量指針,我們不允許改變this中保存的地址。

引入const成員函數(shù)

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

????????默認(rèn)情況下,this的類型是指向類類型非常量版本的常量指針。例如在Sales_data成員函數(shù)中,this的類型是Sales_data *const。盡管this是隱式的,但是它仍然需要遵循初始化規(guī)則,意味著(在默認(rèn)情況下)我們不能把this綁定到一個常量對象上。這一情況也就使得我們不能在一個常量對象上調(diào)用普通的成員函數(shù)。

????????如果isbn是一個普通函數(shù)而且this是一個普通的指針參數(shù),則我們應(yīng)該把this聲明成const?Sales_data *?const。畢竟在isbn函數(shù)體內(nèi)不會改變this所指的對象,所以把this設(shè)置為指向常量的指針有助于提高函數(shù)的靈活性。

????????然而,this是隱式的并且不會出現(xiàn)在參數(shù)列表中,所以在哪兒將this聲明成指向常量的指針就成為我們必須面對的問題。C++語言的做法是允許把關(guān)鍵字const放在成員函數(shù)的參數(shù)列表之后,此時,緊跟在參數(shù)列表后面的const表示this是一個指向常量的指針。像這樣使用const的成員函數(shù)被稱作常量成員函數(shù)

????????可以把isbn的函數(shù)體想象成如下的形式:

??????? //?偽代碼,說明隱式的this指針是如何使用的

??????? //?下面的代碼是非法的:因?yàn)槲覀儾荒茱@示地定義自己的this指針

??????? //?謹(jǐn)記此處的this是一個指向常量的指針,因?yàn)閕sbn是一個常量成員

??????? std :: string Sales_data :: isbn(const Sales_data *const this)? { return this -> bookNo; }?

注:常量對象,以及常量對象的引用或指針都只能調(diào)用常量成員函數(shù)。

類的作用域和成員函數(shù)

????????回顧之前所學(xué)的知識,類本身就是一個作用域。類的成員函數(shù)的定義嵌套在類的作用域之內(nèi),因此,isbn中用到的名字bookNo其實(shí)就是定義在Sales_data內(nèi)的數(shù)據(jù)成員。

????????值得注意的是,即使bookNo定義在isbn之后,isbn也還是能夠使用bookNo。就如后面將要學(xué)習(xí)的那樣,編譯器分兩步處理類:首先編譯成員的聲明,然后才輪到成員函數(shù)體(如果有的話)。因此,成員函數(shù)體可以隨意使用類中的其他成員而無須在意這些成員出現(xiàn)的次序。

在類的外部定義成員函數(shù)

????????像其他函數(shù)一樣,當(dāng)我們在類的外部定義成員函數(shù)時,成員函數(shù)的定義必須與它的聲明匹配。也就是說,返回類型、參數(shù)列表和函數(shù)名都得與類內(nèi)部的聲明保持一致。如果成員被聲明成常量成員函數(shù),那么它的定義也必須在參數(shù)列表后明確指定const屬性。同時,類外部定義的成員的名字必須包含它所屬的類名:

?????????double Sales_data :: avg_price( )? const? {

?????????????? if (units_sold)

???????????????????? return revenue / units_sold;

?????????????? else

?????????????????????return 0;

????????? }

函數(shù)名Sales_data :: avg_price使用作用域運(yùn)算符來說明如下事實(shí):我們定義了一個名為avg_price的函數(shù),并且該函數(shù)被聲明在類Sales_data的作用域內(nèi)。一旦編譯器看到這個函數(shù)名,就能理解剩余的代碼是位于類的作用域內(nèi)的。因此,當(dāng)avg_price使用revenue和units_sold時,實(shí)際上它隱式地使用了Sales_data的成員。

定義一個返回this對象的函數(shù)

???????函數(shù)combine的設(shè)計初衷類似于復(fù)合賦值運(yùn)算符+=,調(diào)用該函數(shù)的對象代表的是賦值運(yùn)算符左側(cè)的運(yùn)算對象,右側(cè)運(yùn)算對象則是通過顯示的實(shí)參被傳入函數(shù):

??????? Sales_data & Sales_data :: combine(const Sales_data &rhs)

??????? {

???????????????? units_sold += rhs.units_sold;? //?把rhs的成員加到this對象的成員上

???????????????? revenue += rhs.revenue;

???????????????? return *this;???????? //?返回調(diào)用該函數(shù)的對象

???????? }

當(dāng)我們的交易處理程序調(diào)用如下的函數(shù)時,

??????? total.combine(trans);??? //?更新變量total當(dāng)前的值

total的地址被綁定到隱式的this參數(shù)上,而rhs綁定到了trans上。因此,當(dāng)combine執(zhí)行下面的語句時,

????????units_sold += rhs.units_sold;???? //?把rhs的承壓un添加到this對象的成員中

效果等同于求total.units_sold和trans.units_sold的和,然后把結(jié)果保存到total.units_sold中。

????????該函數(shù)一個值得關(guān)注的部分是它的返回類型和返回語句。一般來說,當(dāng)我們定義的函數(shù)類似于某個內(nèi)置運(yùn)算符時,應(yīng)該令該函數(shù)的行為盡量模仿這個運(yùn)算符。內(nèi)置的賦值運(yùn)算符把它的左側(cè)運(yùn)算對象當(dāng)成左值返回,因此為了與它保持一致,combine函數(shù)必須返回引用類型。因?yàn)榇藭r的左側(cè)運(yùn)算對象是一個Sales_data的對象,所以返回類型應(yīng)該是Sales_data&。

????????如前所述,我們無須使用隱式的this指針訪問函數(shù)調(diào)用者的某個具體成員,而是需要把調(diào)用函數(shù)的對象當(dāng)成一個整體來訪問:

????????return *this;???? //?返回調(diào)用該函數(shù)的對象

其中,return語句解引用this指針以獲得執(zhí)行該函數(shù)的對象,換句話說,上面的這個調(diào)用返回total的引用。

總結(jié)

以上是生活随笔為你收集整理的7.1.2 定义改进的Sales_date类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。