0
点赞
收藏
分享

微信扫一扫

《c++primer》第五版学习笔记:定义抽象数据类型

迪莉娅1979 2022-01-31 阅读 37

原书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;
}
举报

相关推荐

0 条评论