C++primer第五版课后习题销售类Sales_data的编写

C++primer第五版课后习题销售类Sales_data的编写

  • 头文件
#pragma once
#include <iostream>
#include <string>
using namespace std;
class Sales_data
{
    friend Sales_data add(const Sales_data &,const Sales_data &);////仅仅声明类Sales_date的友元函数,不是通常意义的声明
    friend std::istream &read(istream &,Sales_data &);
    friend std::ostream &print(ostream &,const Sales_data&);

public:
    //////**********下面声明的是Sales_data类的四个构造函数**********//////
    Sales_data(void);
    ~Sales_data(void);
    //Sales_data()=default;///定义一个默认的构造函数
    Sales_data(const std::string &s);
    Sales_data(const std::string &s,unsigned n,double p);
    Sales_data(istream &);/////////此类构造函数,需要执行一些实际的操作来初始化,在.cpp中实现

    /////////********下面声明的是Sales_data类成员包括成员变量和成员函数*********//////
    std::string isbn() const       ////const表明隐式this是一个指向常量的指针,此类的成员函数在此已实现
    {
        return bookNo;
    }
    Sales_data & combine(const Sales_data&);
    double avg_price() const;
private:

    std::string bookNo;   ///iabn编号
    unsigned units_sold;///销售数量,此为类内初始化
    double revenue;////总销售额

};
/////////////下面定义的是Sales_data类相关的非成员函数/////////////
Sales_data add(const Sales_data &,const Sales_data &);
std::ostream &print(ostream &,const Sales_data &);
std::istream &read(istream &,Sales_data &);
  • 实现文件.cpp
#include "Sales_data.h"

//////**********下面声明的是Sales_data类的四个构造函数**********//////
Sales_data::Sales_data(void)
{
}
Sales_data::Sales_data(const std::string &s):bookNo(s)
{
    ///此类函数体为空的构造函数,仅仅为了初始化
}
Sales_data::Sales_data(const std::string &s,unsigned n,double p)
    :bookNo(s),units_sold(n),revenue(p*n)/////成员函数的初始化
{
    ///此类函数体为空的构造函数,仅仅为了初始化
}
Sales_data::Sales_data(istream &is)
{
    read(is,*this);///从is中读数据进行初始化
}

Sales_data::~Sales_data(void)
{
}
double Sales_data::avg_price() const
{
    if (units_sold)
    {
        return revenue/units_sold;////返回的是平均价格
    }
    else
        return 0;
}
Sales_data& Sales_data::combine(const Sales_data &rhs)
{
    units_sold+=rhs.units_sold; //units_sold实质上隐式利用了this,也就是调用函数的对象,例如书上的对象total
    revenue+=rhs.revenue;
    return *this;              //返回调用函数的对象整体(this中隐式),而不是具体成员
}
//////////////以下为类相关的非成员函数的实现////////////////

istream &read(istream &is,Sales_data &item)///将数据读到给定的对象中
{
    double price=0;
    is>>item.bookNo>>item.units_sold>>price;
    item.revenue=price * item.units_sold;////总销售额
    return is;      
}
ostream &print(ostream &os,const Sales_data &item)////将给定对象的内容打印到给定的流中
{
    os<<item.isbn()<<" "<<item.units_sold<<" "
        <<item.revenue<<" "<<item.avg_price();
    return os;      
}
Sales_data add(const Sales_data &lhs,const Sales_data &rhs)/////计算两个Sales_data对象的和
{
    Sales_data sum=lhs;
    sum.combine(rhs);
    return sum;
}
  • 主程序见另一篇文章

你可能感兴趣的:(C++,Class)