c++定义成员函数
1.定義和聲明成員函數(shù)的方式和普通函數(shù)差不多。成員函數(shù)的聲明必須在類的內(nèi)部,他的定義則即可以在類的內(nèi)部也可以在類的外部。非成員函數(shù)的定義和聲明都在類的外部。
struct Sales_data{std::string isbn() const { return bookNo; }double avg_price() const;std::string bookNo;unsigned units_sold = 0;double revenue = 0.0; };2.成員函數(shù)通過名為this的額外的隱式參數(shù)來訪問調(diào)用它的那個(gè)對(duì)象。
當(dāng)我們調(diào)用一個(gè)成員函數(shù)時(shí),用請(qǐng)求該函數(shù)的對(duì)象地址初始化this。
在成員函數(shù)內(nèi),我們可以直接使用調(diào)用該函數(shù)的對(duì)象的成員,無(wú)需通過成員訪問運(yùn)算符。因?yàn)閠his就相當(dāng)于調(diào)用成員函數(shù)的那個(gè)對(duì)象。任何對(duì)類成員的直接訪問都被看作this的隱式引用。
std::string isbn() const { return bookNo; }//成員函數(shù)的定義 total.isbn();//調(diào)用成員函數(shù) //調(diào)用成員函數(shù),實(shí)際上是在替某個(gè)對(duì)象調(diào)用它。isbn反回bookNo時(shí),實(shí)際上它隱式反回total.bookNo。 /* total.isbn()在編譯時(shí),編譯器負(fù)責(zé)把total的地址傳給isbn的隱式形參this 偽代碼:Sales_data::isbn(&total) this形參是隱式定義的,任何自定義名為this的參數(shù)或變量的行為都是違法的。 我們可以在成員函數(shù)體內(nèi)部使用this。 std::string isbn() const {return this->bookNo;} this總指向這個(gè)對(duì)象,所以this是個(gè)常量指針,不允許改變this中保存的地址。 */3.使用const修改隱式this指針的類型:
默認(rèn)情況下,this的類型是指向類類型非常量版本的常量指針。在Sales_data成員函數(shù)中,this的類型是Sales_data *const。這就意味著,默認(rèn)情況下,我們不能在一個(gè)常量對(duì)象上調(diào)用普通的成員函數(shù)(請(qǐng)參考參數(shù)傳遞)。與此同時(shí)由于在isbn()函數(shù)體內(nèi)不會(huì)改變this所指對(duì)象,所以我們完全可以把this設(shè)置為指向常量的指針。有助于提高函數(shù)靈活性。
std::string isbn() const { return bookNo; }//緊跟參數(shù)列表后面的const表示this是一個(gè)指向常量的指針,這樣使用const的成員函數(shù)被稱作常量成員函數(shù)。//下面是偽代碼,說明this指針是如何使用的,下面代碼是非法的,因?yàn)槲覀儾荒茱@示定義this指針。這里的this是一個(gè)指向常量的指針,因?yàn)閕sbn是一個(gè)常量成員。 std::string Sales_data::isbn(const Sales_data *const this) {return this->isbn;}4.類的成員函數(shù)的定義嵌套在類的作用域之內(nèi)。在類的外部定義成員函數(shù)時(shí),要加上作用域運(yùn)算符,表示該函數(shù)剩余代碼是位于類的作用域內(nèi)的。
struct Sales_data{std::string isbn() const { return bookNo; }double avg_price() const;std::string bookNo;unsigned units_sold = 0;double revenue = 0.0; }; double Sales_data::avg_price() const{if(units_sold)return revenue/units_sold;//隱式使用Sales_data成員elsereturn 0; }5.定義一個(gè)反回this對(duì)象的函數(shù):
combine類似一個(gè)符合賦值運(yùn)算符+=,total.combine(trans);trans相當(dāng)于+=右側(cè)運(yùn)算對(duì)象,total相當(dāng)于左側(cè)運(yùn)算對(duì)象。調(diào)用total.combine(trans)時(shí),total的地址綁定到隱式的this參數(shù)上,rhs綁定到了trans上。
我們定義函數(shù)類似于某個(gè)內(nèi)置運(yùn)算賦時(shí),應(yīng)該盡量模仿這個(gè)運(yùn)算符,內(nèi)置的賦值運(yùn)算符把他左側(cè)運(yùn)算對(duì)象當(dāng)成左值返回,因此為了保持一致,combine函數(shù)必須返回引用類型。所以返回類型是Sales_data&
struct Sales_data{std::string isbn() const { return bookNo; }double avg_price() const;Sales_data& combine(const Sales_data&);std::string bookNo;unsigned units_sold = 0;double revenue = 0.0; }; Sales_data& Sales_data::combine(const Sales_data &rhs) {units_sold += rhs.units_sold;//rhs成員加到this對(duì)象的成員上。revenue += rhs.revenue;return *this;//返回調(diào)用該函數(shù)的對(duì)象 }總結(jié)
 
                            
                        - 上一篇: 计算机gt的使用方法,旗舰级综合效果器
- 下一篇: 单片机实验:交通灯控制
