1.类的成员函数可以在类的定义内定义,也可以在类的定义外定义(这时就是在类内声明)。编译器隐式地将在类内定义的成员函数当作内联函数(按照谷歌C++代码规则——不要超过10行,否则会影响效率!)。
2.成员函数含有额外的、隐含的形参:this。this代表的是调用这个成员函数的对象的地址!例子:
bool same_isbn(const Sales_item &rhs) const
{ 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函数体相当于:
bool Sales_item::same_isbn (const Sales_item *const this,const Sales_item &rhs) const
{ return (this->isbn == rhs.isbn); }
用这种方式使用const的函数称为常量成员函数。由于this是指向const对象的指针,const成员函数不能修改调用该函数的对象。因此,函数same_isbn只能读取而不能修改调用它们的对象的数据成员。
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;
};