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. webpack核心模块tapable源码解析

    上一篇文章我写了tapable的基本用法,我们知道他是一个增强版版的发布订阅模式,本文想来学习下他的源码.tapable的源码我读了一下,发现他的抽象程度比较高,直接扎进去反而会让人云里雾里的,所以本 ...

  2. windows一些知识

    宽字节 1.什么是ASCII码? 一张存储了字母大小写与一些符号的表,用一个字节表示,最高位不使用,最多只能存储128个符号或字母,但世界上有很多种语言,这远远不够 2.什么是扩展ASCII码? 把最 ...

  3. [状压DP]吃奶酪

    吃 奶 酪 吃奶酪 吃奶酪 题目描述 房间里放着 n n n 块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在 ( 0 , 0 ) (0,0) (0,0)点处. 输入 第一行有一个整 ...

  4. 学一手,知乎大V(轮子哥)当年靠它进微软亚洲研究院

    前言 vczh本名陈梓瀚,不过大家更愿意叫他「轮子哥」,毕业于华南理工大学软件学院.vczh大学时代就在微软实习,毕业后即加入微软.开始时是在微软上海,后来进入北京的微软亚洲研究院.现已移居美国西雅图 ...

  5. 经典变长指令SIB

    前言 ModR/M字段是用来进行内存寻址的,可当地址形如DS:[EAX + ECX*2 + 12345678]时,仅仅靠ModR/M字段,是描述不出来的. 这时就在ModR/M后面增加一个SIB字节, ...

  6. Scrapy 5+1 ——五大坑附送一个小技巧

    笔者最近对scrapy的学习可谓如火如荼,虽然但是,即使是一整天地学习下来也会有中间两三个小时的"无效学习",不是笔者开小差,而是掉进了深坑出不来. 在此,给各位分享一下作为一名S ...

  7. 【PHP】用了这么久的Laravel框架,你分析过核心架构了没

    Laravel最初的设计是为了面向MVC架构的,它可以满足如事件处理.用户身份验证等各种需求.另外它还有一个由管理数据库强力支持,用于管理模块化和可扩展性代码的软件包管理器. Laravel以其简洁. ...

  8. JDK8中新日期时间API

    它们面临的问题是:可变性:像日期和时间这样的类应该是不可变的.偏移性:Date中的年份是从1900开始的,而月份都从0开始.格式化:格式化只对Date有用,Calendar则不行.此外,它们也不是线程 ...

  9. Go-26-Json

    JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式,因简单.可读性强被广泛使用. Go的标准包encoding/json对JSO ...

  10. php文件夹下文件批量重命名

    php文件夹下文件批量重命名 <?php header("Content-type:text/html;charset=utf-8"); $dir = __DIR__.'./ ...