c++定义成员函数
1.定義和聲明成員函數的方式和普通函數差不多。成員函數的聲明必須在類的內部,他的定義則即可以在類的內部也可以在類的外部。非成員函數的定義和聲明都在類的外部。
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.成員函數通過名為this的額外的隱式參數來訪問調用它的那個對象。
當我們調用一個成員函數時,用請求該函數的對象地址初始化this。
在成員函數內,我們可以直接使用調用該函數的對象的成員,無需通過成員訪問運算符。因為this就相當于調用成員函數的那個對象。任何對類成員的直接訪問都被看作this的隱式引用。
std::string isbn() const { return bookNo; }//成員函數的定義 total.isbn();//調用成員函數 //調用成員函數,實際上是在替某個對象調用它。isbn反回bookNo時,實際上它隱式反回total.bookNo。 /* total.isbn()在編譯時,編譯器負責把total的地址傳給isbn的隱式形參this 偽代碼:Sales_data::isbn(&total) this形參是隱式定義的,任何自定義名為this的參數或變量的行為都是違法的。 我們可以在成員函數體內部使用this。 std::string isbn() const {return this->bookNo;} this總指向這個對象,所以this是個常量指針,不允許改變this中保存的地址。 */3.使用const修改隱式this指針的類型:
默認情況下,this的類型是指向類類型非常量版本的常量指針。在Sales_data成員函數中,this的類型是Sales_data *const。這就意味著,默認情況下,我們不能在一個常量對象上調用普通的成員函數(請參考參數傳遞)。與此同時由于在isbn()函數體內不會改變this所指對象,所以我們完全可以把this設置為指向常量的指針。有助于提高函數靈活性。
std::string isbn() const { return bookNo; }//緊跟參數列表后面的const表示this是一個指向常量的指針,這樣使用const的成員函數被稱作常量成員函數。//下面是偽代碼,說明this指針是如何使用的,下面代碼是非法的,因為我們不能顯示定義this指針。這里的this是一個指向常量的指針,因為isbn是一個常量成員。 std::string Sales_data::isbn(const Sales_data *const this) {return this->isbn;}4.類的成員函數的定義嵌套在類的作用域之內。在類的外部定義成員函數時,要加上作用域運算符,表示該函數剩余代碼是位于類的作用域內的。
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.定義一個反回this對象的函數:
combine類似一個符合賦值運算符+=,total.combine(trans);trans相當于+=右側運算對象,total相當于左側運算對象。調用total.combine(trans)時,total的地址綁定到隱式的this參數上,rhs綁定到了trans上。
我們定義函數類似于某個內置運算賦時,應該盡量模仿這個運算符,內置的賦值運算符把他左側運算對象當成左值返回,因此為了保持一致,combine函數必須返回引用類型。所以返回類型是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對象的成員上。revenue += rhs.revenue;return *this;//返回調用該函數的對象 }總結
- 上一篇: 计算机gt的使用方法,旗舰级综合效果器
- 下一篇: c++函数返回值是一个引用