7.1定义抽象数据类型

定义改进的Sale_data类
成员函数的声明必须在类的内部,它的定义则既可以在类的内部也可以类的外部。作为接口组成部分的成员函数,它们的声明和定义都在类的外部。

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&);

成员函数的声明必须在类的内部,它的定义既可以在类的内部也可以在类的外部;作为接口的非成员函数,它们的定义和声明都在类的外部。
//常量成员函数
std::string isbn() const {return bookNo;}

定义成员函数
尽管所有成员函数都必须在类的内部声明,但是成员函数可以定义在类外。
例如:
Std::string isbn() const {return this->bookNo;}
引入this

#include <iostream>
#include <string>
using namespace std;
struct Sales_data
{
    std::string isbn() const 
    {
        return this->bookNo;
    }
    Sales_data& combine(const Sales_data&);
    double avg_price() const;
    std::string bookNo = "1111";
    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&);
int main()
{
    Sales_data total;
    total.isbn();
    return 0;
}

这里写图片描述

这里写图片描述
引入const成员函数:
在默认情况下,this的类型是指向类类型非常量版本的常量指针。例如在Sales_item成员中,this的类型是Sales_item *const。这样我们就不能把this绑定到一个常量对象上。这情况使我们不能再一个常量对象上调用普通的成员函数。如果isbn是一个普通函数并且this是一个普通的指针参数,则我们应该把this声明成const Sales_item *const。C++语法中允许const关键字放在成员函数的参数列表之后。参数后面的const表示this是一个指向常量的指针。
在类的外部定义成员函数:

当我们在类的外部定义成员函数时,成员函数的定义必须与它声明匹配。也就是说,返回类型,参数列表和函数名都得与类内部的声明保持一致。如果成员函数被声明为常量成员函数,那么它的定义也必须在参数列表后明确指定const属性。类外部定义的成员的名字必须包含它所属的类名:

double Sales_data::avg_price() const
{
    if(units_sold)
        return revenue/units_sold;
    else
        return 0;
}

定义一个返回this对象的函数:
这里写图片描述
这里写图片描述
这里写图片描述
定义类相关的非成员函数:

#include <iostream>
#include <string>
using namespace std;
class Sales_data
{
    friend Sales_data add(const Sales_data &lhs, const Sales_data &rhs);
    friend std::ostream &print(std::ostream &os, const Sales_data &item);
    friend std::istream &read(std::istream &is, Sales_data &item);
public:
    std::string isbn()const{ return bookNo; }
    double avg_price()const;
    Sales_data& combine(const Sales_data &rhs)
    {
        units_sold += rhs.units_sold;//累加书籍的销售量
        saleprice = (rhs.saleprice*rhs.units_sold + saleprice*units_sold)
            / (rhs.units_sold + units_sold);//重新计算实际销售价格
        if (sellingprice != 0)
            discount = saleprice / sellingprice;//重新计算实际折扣
        return *this;//返回合并后的结果
    }
private:
    std::string bookNo;//书籍编号
    unsigned units_sold = 0;//销售量
    double sellingprice = 0.0;//原始价格
    double saleprice = 0.0;//实售价格
    double discount = 0.0;//折扣
    double revenue = 0.0;
};
//在类的外部定义成员函数
double Sales_data::avg_price()const
{
    if (units_sold)
        return revenue / units_sold;
}
//Sales_data的非成员接口函数
Sales_data add(const Sales_data &lhs, const Sales_data &rhs)
{
    Sales_data sum = lhs;
    sum.combine(rhs);
    return sum;
}
std::ostream &print(std::ostream &os, const Sales_data &item)
{
    os << item.isbn() << " " << item.units_sold << " " << item.sellingprice
        << " " << item.saleprice << " " << item.discount;
    return os;
}
std::istream &read(std::istream &is, Sales_data &item)
{
    is >> item.bookNo >> item.units_sold >> item.sellingprice >>
        item.saleprice;
    return is;
}
int main()
{
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值