1.類的成員函數能夠在類的定義內定義,也能夠在類的定義外定義(這時就是在類內聲明)。編譯器隱式地將在類內定義的成員函數看成內聯函數(按照谷歌C++代碼規則——不要超過10行,不然會影響效率!)。函數
2.成員函數含有額外的、隱含的形參:this。this表明的是調用這個成員函數的對象的地址!例子:this
bool same_isbn(const Sales_item &rhs) constspa
{ return isbn == rhs.isbn; }指針
rhs.isbn是函數傳入參數對應的實參(是一個Sales_item的對象)的數據成員isbn。而有一個isbn,則指的是this.isbn,也即:調用函數的那個對象的數據成員isbn。好比調用方法爲:total.same_isbn(trans);其中trans是:Sales_item trans定義而來的一個對象!對象
能夠把total.same_isbn(trans);重寫爲: Sales_item::same_isbn(this,trans);或者更明確點: Sales_item::same_isbn(&total,trans);注意:this指針是隱式定義的,不須要在函數形參表中包含this指針(不合法的),可是,在函數體中能夠顯式地使用this指針。如:bool same_isbn(const Sales_item &rhs) const { return this->isbn == rhs.isbn; },雖然不必,可是是合法的!注意此處:this->isbn而非this.isbn,由於this並不是是對象自己,this是指向對象的指針,一樣的表達方式爲:(*this).isbn與this->isbn等價! 編譯器
3.注意到上面2中的const的做用:const改變了隱含的this形參的類型。在調用total.same_isbn(trans)時,隱含的this形參將是一個指向total對象的const Sales_Item*類型的指針。上面的same_isbn函數體至關於:string
bool Sales_item::same_isbn (const Sales_item *const this,const Sales_item &rhs) constit
{ return (this->isbn == rhs.isbn); }編譯
用這種方式使用const的函數稱爲常量成員函數。因爲this是指向const對象的指針,const成員函數不能修改調用該函數的對象。所以,函數same_isbn只能讀取而不能修改調用它們的對象的數據成員。class
4.構造函數,是一種特殊的成員函數。一樣是:必須在類內聲明,能夠在類內或類外進行定義。必須與類同名,沒有返回值。一個類能夠有多個構造函數,每一個構造函數必須有與其餘構造函數不一樣數目或類型的形參。
Sales_item():units_sold(0),revenus(0,0) { }
比較疑惑的是units_sold(0),revenus(0,0),稱爲構造函數的初始化列表。構造函數的初始化列表爲類的一個或多個數據成員指定初值。通常,除非在初始化列表中有其餘表述,不然具備類類型的成員皆被其默認的構造函數自動初始化。因而,isbn由string類默認構造函數初始化爲空串。
目前,較完整的類定義爲:
class Sales_item {
public :
double avg_price() const;
bool same_isbn(const Sales_item &rhs) const
{ return isbn == rhs.isbn; }
Sales_item():units_sold(0),revenus(0,0) { }
private :
std :: string isbn;
unsigned units_sold;
double revenue;
};