#include <iostream>
#include <string>
#include <cassert>
#include <algorithm>
#include <vector>
using namespace std; class Sales_data
{
friend std::istream& operator>>(std::istream&, Sales_data&);
friend std::ostream& operator<<(std::ostream&, const Sales_data&);
friend Sales_data operator+(const Sales_data&,const Sales_data&);//非成员函数(对称性)
friend bool operator==(const Sales_data&,const Sales_data&);
friend bool operator!=(const Sales_data&,const Sales_data&); public:
Sales_data():units_sold(0),revenue(0.0){}
Sales_data(const std::string &s):bookNo(s),units_sold(0),revenue(0.0){}
Sales_data(const std::string &s,unsigned n,double p):bookNo(s),units_sold(n),revenue(n*p){}
Sales_data(std::istream &is); Sales_data& operator+=(const Sales_data&);//成员函数(复合赋值通常是成员函数)
std::string isbn()const{return bookNo;} Sales_data& operator=(const std::string &s);
private:
inline double avg_price()const;//inline
private:
std::string bookNo; //isbn
unsigned units_sold;//销售量
double revenue; //总价
}; inline double Sales_data::avg_price() const
{
return units_sold ? revenue/units_sold : 0;
} Sales_data::Sales_data(std::istream &is)
{
is>>*this;
} std::istream& operator>>(std::istream& is,Sales_data& item)
{
double price=0.0;
is>>item.bookNo>>item.units_sold>>price;
if(is)//检測流的状态,输入易错且改写对象数据
item.revenue=item.units_sold*price;
else
item=Sales_data();
return is;
} std::ostream& operator<<(std::ostream& os, const Sales_data& item)
{
os<<item.isbn()<<" "<<item.units_sold<<" "
<<item.revenue<<" "<<item.avg_price();
return os;
} Sales_data operator+(const Sales_data& item1,const Sales_data& item2)
{
Sales_data s(item1);
s+=item2;//调用复合赋值
return s;
} Sales_data& Sales_data::operator+=(const Sales_data& rhs)
{
units_sold+=rhs.units_sold;
revenue+=rhs.revenue;
return *this;
} bool operator==(const Sales_data& lhs,const Sales_data& rhs)
{
return lhs.bookNo==rhs.bookNo &&
lhs.units_sold==rhs.units_sold &&
lhs.revenue==rhs.revenue;
} bool operator!=(const Sales_data& lhs,const Sales_data& rhs)
{
return !(lhs==rhs);
} Sales_data& Sales_data::operator=(const std::string &s)
{
*this=Sales_data(s);
return *this;
}

C++primer书店程序的更多相关文章

  1. [笔记] 《c++ primer》书店程序 Chapter 1

    书店程序是<c++ primer>中重要的实例,涉及大部分重要知识点,但代码分散阅读不便,下面按照章节顺序总结 Sales_item.h #ifndef SALESITEM_H // we ...

  2. [笔记] 《c++ primer》书店程序 Chapter7

    Sales_data.h 1 #ifndef SALES_DATA_H 2 #define SALES_DATA_H 3 4 #include "Version_test.h" 5 ...

  3. [笔记] 《c++ primer》书店程序 Chapter2

    Sales_data.h 1 #ifndef SALES_DATA_H 2 #define SALES_DATA_H 3 4 #include "Version_test.h" 5 ...

  4. C++Primer第5版学习笔记(一)

    C++Primer第5版学习笔记(一) 第一.二章的重难点内容        这个笔记本主要记录了我在学习C++Primer(第5版,中文版)的过程中遇到的重难点及其分析.因为第一.二章都比较简单,因 ...

  5. C++ Primer 5th 第1章 开始

    *****代码在Ubuntu g++ 5.31 / clang++ 3.8(C++11)下编写调试***** 每个C++程序必须有一个main( )函数,main( )函数的返回值也必须是int类型, ...

  6. C++ Primer中文版(第5版)

    <C++ Primer中文版(第5版)> 基本信息 作者: (美)Stanley B. Lippman(斯坦利 李普曼)    Josee Lajoie(约瑟 拉乔伊)    Barbar ...

  7. 《C++ Primer》读书笔记—第二章 变量和基本类型

    声明: 文中内容收集整理自<C++ Primer 中文版 (第5版)>,版权归原书所有. 学习一门程序设计语言最好的方法就是练习编程. 1.8比特的char类型计算机表示的实际范围是-12 ...

  8. C++ Primer 5th 第10章 泛型算法

    练习10.1:头文件algorithm中定义了一个名为count的函数,它类似find,接受一对迭代器和一个值作为参数.count返回给定值在序列中出现的次数.编写程序,读取int序列存入vector ...

  9. C++ Primer 5th 第8章 IO库

    IO类对象不允许进行拷贝操作. IO类中定义后一些函数和标志,可以用于访问和操作流的状态. 一旦流发生错误,后续IO操作都是失败的. 读写IO对象会改变IO对象的状态. 每个输出流都管理一个缓冲区. ...

随机推荐

  1. qml与c++混合编程

    QML 与 C++ 混合编程内容:1. QML 扩展2. C++ 与 QML 交互3. 开发时要尽量避免使用的 QML 元素4. demo 讲解5. QML 语法C++ 与 QML 的交互是通过注册 ...

  2. openvswith Frequently Asked Questions

    Open vSwitch <http://openvswitch.org> 参考地址:http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=ope ...

  3. java中BufferedReader 有什么用

    这个类就是一个包装类,它可以包装字符流,将字符流放入缓存里,先把字符读到缓存里,到缓存满了或者你flush的时候,再读入内存,就是为了提供读的效率而设计的. BufferedReader buffer ...

  4. Docker学习总结(13)——从零开始搭建Jenkins+Docker自动化集成环境

    本文只简单标记下大概的步骤,具体搭建各个部分的细节,还请自行搜索.第一.二部分只是对Jenkins和Docker的简单介绍,熟悉的同学请直接跳到第三部分. 一.关于Jenkins Jenkins简介 ...

  5. 取消记录tableView选中效果

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self. ...

  6. C++模板中的静态

    #include <iostream> #include <stdlib.h> using namespace std; template<class T> cla ...

  7. 高速排序算法C++实现

    //quick sort //STL中也有现成的高速排序算法.内部实现採用了下面技巧 //1)枢轴的选择採取三数取中的方式 //2)后半段採取循环的方式实现 //3)高速排序与插入排序结合 #incl ...

  8. Mysql 数据迁移后 启动出错

    今天上班后不知道为什么,mysql一直无法启动,折腾了半天于是决定重装 我本地的server用的是wamp , 重装的时候, 要进行数据备份 , 我使用的最简单粗暴的备份方式, 就是直接进入到mysq ...

  9. doT.js的使用

    引言 doT.js可以更好的在html端使用json数据. {{ }} for evaluation 模板标记符 {{= }} for interpolation 输出显示,默认变量名叫it {{! ...

  10. CxImage动态加载图片(判断图片文件类型)

    1.打开一张图可以通过创建一个新的CxImage对象来完成,通过构造函数来打开一张图CxImage::CxImage(const char * filename, DWORD imagetype)其中 ...