Sales_data.h

 1 #ifndef SALES_DATA_H
2 #define SALES_DATA_H
3
4 #include "Version_test.h"
5
6 #include <string>
7 #include <iostream>
8
9 class Sales_data {
10 friend Sales_data add(const Sales_data&, const Sales_data&);
11 friend std::ostream &print(std::ostream&, const Sales_data&);
12 friend std::istream &read(std::istream&, Sales_data&);
13 public:
14 // constructors
15 // using the synthesized version is safe only
16 // if we can also use in-class initializers
17 #if defined(IN_CLASS_INITS) && defined(DEFAULT_FCNS)
18 Sales_data() = default;
19 #else
20 Sales_data(): units_sold(0), revenue(0.0) { }
21 #endif
22 #ifdef IN_CLASS_INITS
23 Sales_data(const std::string &s): bookNo(s) { }
24 #else
25 Sales_data(const std::string &s):
26 bookNo(s), units_sold(0), revenue(0.0) { }
27 #endif
28 Sales_data(const std::string &s, unsigned n, double p):
29 bookNo(s), units_sold(n), revenue(p*n) { }
30 Sales_data(std::istream &);
31
32 // operations on Sales_data objects
33 std::string isbn() const { return bookNo; }
34 Sales_data& combine(const Sales_data&);
35 double avg_price() const;
36 private:
37 std::string bookNo;
38 #ifdef IN_CLASS_INITS // using the synthesized version is safe only
39 unsigned units_sold = 0;
40 double revenue = 0.0;
41 #else
42 unsigned units_sold;
43 double revenue;
44 #endif
45 };
46
47
48 // nonmember Sales_data interface functions
49 Sales_data add(const Sales_data&, const Sales_data&);
50 std::ostream &print(std::ostream&, const Sales_data&);
51 std::istream &read(std::istream&, Sales_data&);
52
53 // used in future chapters
54 inline
55 bool compareIsbn(const Sales_data &lhs, const Sales_data &rhs)
56 {
57 return lhs.isbn() < rhs.isbn();
58 }
59 #endif
  • 成员函数通过隐式this指针访问调用它的对象
  • 常量成员函数不可修改调用对象的内容
  • 通过非成员函数访问类的私有成员,需在类内将此函数声明为友元(友元声明不是函数声明,函数声明在类外)
  • 经常使用的短函数声明为内联函数并在.h文件中定义,类内定义的函数是隐式内联的
  • 构造函数没有返回值,不能被声明为const

Sales_data.cpp

 1 #include <iostream>
2 using std::istream; using std::ostream;
3
4 #include "Sales_data.h"
5 Sales_data::Sales_data(std::istream &is)
6 {
7 // read will read a transaction from is into this object
8 read(is, *this);
9 }
10
11 double
12 Sales_data::avg_price() const {
13 if (units_sold)
14 return revenue/units_sold;
15 else
16 return 0;
17 }
18
19 // add the value of the given Sales_data into this object
20 Sales_data&
21 Sales_data::combine(const Sales_data &rhs)
22 {
23 units_sold += rhs.units_sold; // add the members of rhs into
24 revenue += rhs.revenue; // the members of ``this'' object
25 return *this; // return the object on which the function was called
26 }
27
28 Sales_data
29 add(const Sales_data &lhs, const Sales_data &rhs)
30 {
31 Sales_data sum = lhs; // copy data members from lhs into sum
32 sum.combine(rhs); // add data members from rhs into sum
33 return sum;
34 }
35
36 // transactions contain ISBN, number of copies sold, and sales price
37 istream&
38 read(istream &is, Sales_data &item)
39 {
40 double price = 0;
41 is >> item.bookNo >> item.units_sold >> price;
42 item.revenue = price * item.units_sold;
43 return is;
44 }
45
46 ostream&
47 print(ostream &os, const Sales_data &item)
48 {
49 os << item.isbn() << " " << item.units_sold << " "
50 << item.revenue << " " << item.avg_price();
51 return os;
52 }

avg_price.cpp

 1 #include <iostream>
2 using std::cerr; using std::cin; using std::cout; using std::endl;
3
4 #include "Sales_data.h"
5
6 int main()
7 {
8 Sales_data total; // variable to hold the running sum
9 if (read(cin, total)) { // read the first transaction
10 Sales_data trans; // variable to hold data for the next transaction
11 while(read(cin, trans)) { // read the remaining transactions
12 if (total.isbn() == trans.isbn()) // check the isbns
13 total.combine(trans); // update the running total
14 else {
15 print(cout, total) << endl; // print the results
16 total = trans; // process the next book
17 }
18 }
19 print(cout, total) << endl; // print the last transaction
20 } else { // there was no input
21 cerr << "No data?!" << endl; // notify the user
22 }
23
24 return 0;
25 }

[笔记] 《c++ primer》书店程序 Chapter7的更多相关文章

  1. C++primer书店程序

    #include <iostream> #include <string> #include <cassert> #include <algorithm> ...

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

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

  3. Lua学习笔记4. coroutine协同程序和文件I/O、错误处理

    Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...

  4. 微信小程序开发:学习笔记[7]——理解小程序的宿主环境

    微信小程序开发:学习笔记[7]——理解小程序的宿主环境 渲染层与逻辑层 小程序的运行环境分成渲染层和逻辑层. 程序构造器

  5. Linux进程线程学习笔记:运行新程序

    Linux进程线程学习笔记:运行新程序                                         周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下 ...

  6. 个人学习笔记:C语言程序结构

    个人笔记:C语言程序 函数 语句 输入输出对象 标识符 关键字 函数 一个C语言源程序,是由一个或多个函数定义顺序组成的,其中必须有一个函数名为main的主函数.C语言源程序中的函数是指完成特定数据处 ...

  7. [笔记] 《c++ primer》显示器程序 Chapter7

    补充Sales_data没有体现出的其他类特性 Screen.h 1 #include <string> 2 #include <iostream> 3 4 class Scr ...

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

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

  9. C++ Primer 学习笔记_88_用于大型程序的工具 --异常处理[续1]

    用于大型程序的工具 --异常处理[续1] 四.又一次抛出 有可能单个catch不能全然处理一个异常.在进行了一些校正行动之后,catch可能确定该异常必须由函数调用链中更上层的函数来处理,catch能 ...

随机推荐

  1. 第16 章 : 深入理解 etcd:基于原理解析

    深入理解 etcd:基于原理解析 本文将主要分享以下三方面的内容: 第一部分,会为大家介绍 etcd 项目发展的整个历程,从诞生至今 etcd 经历的那些重要的时刻: 第二部分,会为大家介绍 etcd ...

  2. TreeMap和HashMap的元素比较

    写在前面的话 2021.04,准备面试和CCF CSP认证的我准备做一套CCF模拟题,然后就有了此篇博客(x 题目:201912-2 回收站报数 题目截图: 第一个想法:读取每个垃圾的位置,存入Tre ...

  3. 如何快速搭建自己的ERP系统,4步源码快速安装odoo教程

    上一篇内容:了解什么是Odoo,为二次开发做准备 1.下载odoo源码 Github地址:https://github.com/odoo/odoo Gitee地址:https://gitee.com/ ...

  4. Dynamics CRM邮箱配置

    Dynamics CRM对邮箱有很好的支持,开通邮箱后方便用户通过邮件进行Dynamics CRM的业务处理,同时也可以作为一直消息流提醒的手段应用于审批.通知等场景,可以做一些更深入的功能拓展. 本 ...

  5. BUAA_2020_OO_UNIT4_REVIEW&ALL_REVIEW

    OO第四单元总结&&学期总结 1. 第四单元作业总结 本单元三次作业都围绕了UML图的建模展开,第十三次作业只有类图,第十四次作业增加了顺序图和状态图,第十五次增加了部分UML规则的判 ...

  6. 自定义grub主题

    1 概述 自定义grub引导菜单的主题,笔者的linux是deepin,感觉默认的grub主题不太好看,嗯,没办法,就是想改了. 这篇文章主要是修改/boot/grub/grub.cfg以及/boot ...

  7. JAVAEE_Servlet_22_Cookie实现十天内免登录

    Cookie实现十天内免登录 代码: - CheckLogin 查看是否获取到了Cookie,如果获取到了连接数据库验证Cookie发过来的用户名和密码,如果没有获取到Cookie信息,那么就跳转到登 ...

  8. 你可能不知道的CSS元素隐藏“失效”以其妙用

    在CSS中,让元素隐藏(指屏幕范围内肉眼不可见)的方法很多,有的占据空间,有的不占据空间:有的可以响应点击,有的不能响应点击.后宫选秀--一个一个看. { display: none; /* 不占据空 ...

  9. 千位分隔符,音频音量加强,transform 垂直居中

    1.最近做阴阳师日本官网,其中有个功能是获取预约人数,设计稿上的人数是这样151,567,000,想了想自己写还有点麻烦,于是网上copy了代码,再修改了下. 其中,有一点需要注意的是:函数中的str ...

  10. Xposed学习二:实现机制

    在上一篇我们学习了如何在AS中创建Xposed模块,本篇来分析下官方教程中redClock的实现原理.本系列文章基于version-51 public void handleLoadPackage(X ...