原书p228
首先要知道在书里面定义了一个这样的类:
struct Sales_data
{
std::string isbn() const{return bookNo;}
Sales_data& combine(const Sales_data&);
double avg_price() const;
//数据成员
std::string bookNo;
unsigned units_sold=0;//卖出的个数
double revenue=0.0;//总收益
};
//Sales_data的非成员接口函数
Sales_data add(const Sales_data&,const Sales_data&);
std::ostream &print(std::ostream&,const Sales_data&);
std::istream &read(std::istream&,Sales_data&);
定义成员函数
尽管所有成员函数都必须在类的内部声明,但是成员函数体可以定义在类内也可以定义在类外。对于Sales_data类来说,isbn函数定义在了类内,而combine和avg_price定义在了类外。
我们首先介绍isbn函数,它的参数列表为空,返回值是一个string对象。
关于这个函数isbn(),一个问题是他是如何获得bookNo成员所依赖的对象的呢?
引入this
让我们观察isbn成员函数的调用
Sales_data total;
total.isbn();
p268页将介绍一种例外的形式
当我们调用成员函数时,实际上是在替某个对象调用它。如果isbn指向Sales_data的成员(这里是bookNo),则它隐式地指向调用该函数的对象的成员.
引入const成员函数
引入的必要性:
可以把isbn的函数体想象成如下形式:
std::string Sales_data::isbn(const Sales_data *const this)
{return this->bookNo;}
isbn可以读取调用它的对象的数据成员,但是不能写入新值。
类作用域和成员函数
类本身就是一个作用域,因此,isbn中用到的名字其实就是定义在Sales_data内的数据成员。
在类的外部定义成员函数
返回类型,参数列表和函数名都得与类内部的声明保持一致。如果成员被声明成常量成员函数,那么定义的成员的名字必须包含它所属的类名:
double Sales_data::avg_price()const
{
if(units_sold)
return revenue/units_sold;
return 0;
}
定义一个返回this对象的函数
Sales_data& Sales_data::combine(const Sales_data&rhs)
{
units_sold+=rhs.units_sold;
revenue+=rhs.revenue;
return *this;
}