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. 推荐一款全能测试开发神器:Mockoon!1分钟快速上手!

    1. 说一下背景 在日常开发或者测试工作中,经常会因为下游服务不可用或者不稳定时,通过工具或者技术手段去模拟一个HTTP Server,或者模拟所需要的接口数据. 这个时候,很多人脑海里,都会想到可以 ...

  2. 自动获取IMC系统所有网络设备资产信息

    1 #coding=utf8 2 3 """ 4 CMDB接口调用 5 """ 6 import csv 7 import json 8 i ...

  3. 移动文件--mv

    mv file  srcpath 将文件移动到指定目录下 mv dir srcpath  将文件移动到指定目录下

  4. 学习笔记-git 上传

    0.git add * (如果你需要修改源码需要在 1 之前使用,然后再回到 1) 1.git commit -m '提交文字描述' 2.git push -u origin master (上传到主 ...

  5. Facebook资深工程师带你学Python核心技术

    人工智能时代下,Python毫无疑问是最热的编程语言.在推开Python的大门后却发现,Python入门容易但精通却不易. 想要精通这门语言,必须真正理解知识概念,比如适当从源码层面深化认知,然后熟悉 ...

  6. 【Java并发】1. Java线程内存模型JMM及volatile相关知识

    Java招聘知识合集:https://www.cnblogs.com/spzmmd/tag/Java招聘知识合集/ 该系列用于汇集Java招聘需要的知识点 JMM 并发编程的三大特性:可见性(vola ...

  7. 日志收集之filebeat使用介绍

    此系列文章一共分为三部分,分为filebeat部分,logstash部分,es部分.这里会按照每天几百亿条的数据量来考虑,去设计.部署.优化这个日志系统,来最大限度的利用资源,并达到一个最优的性能.本 ...

  8. 浅入Kubernetes(11):了解 Service 和 Endpoint

    目录 Srevice Service 的创建及现象 Service 定义 Endpoint slices 创建 Endpoint.Service Service 创建应用 创建 Endpoint 浅入 ...

  9. jinja2的简单使用

    后端代码 from jinja2 import Template def index(): with open('./index.html', 'r', encoding='utf-8') as fp ...

  10. hdu 2841 Visible Trees(容斥)

    原文链接 There are many trees forming a m * n grid, the grid starts from (1,1). Farmer Sherlock is stand ...