7.1定义抽象数据类型

来源:互联网 发布:淘宝联盟怎么提现 编辑:程序博客网 时间:2024/05/17 22:02

定义改进的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
原创粉丝点击