[笔记] 《c++ primer》书店程序 Chapter7
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的更多相关文章
- C++primer书店程序
#include <iostream> #include <string> #include <cassert> #include <algorithm> ...
- [笔记] 《c++ primer》书店程序 Chapter 1
书店程序是<c++ primer>中重要的实例,涉及大部分重要知识点,但代码分散阅读不便,下面按照章节顺序总结 Sales_item.h #ifndef SALESITEM_H // we ...
- Lua学习笔记4. coroutine协同程序和文件I/O、错误处理
Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...
- 微信小程序开发:学习笔记[7]——理解小程序的宿主环境
微信小程序开发:学习笔记[7]——理解小程序的宿主环境 渲染层与逻辑层 小程序的运行环境分成渲染层和逻辑层. 程序构造器
- Linux进程线程学习笔记:运行新程序
Linux进程线程学习笔记:运行新程序 周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下 ...
- 个人学习笔记:C语言程序结构
个人笔记:C语言程序 函数 语句 输入输出对象 标识符 关键字 函数 一个C语言源程序,是由一个或多个函数定义顺序组成的,其中必须有一个函数名为main的主函数.C语言源程序中的函数是指完成特定数据处 ...
- [笔记] 《c++ primer》显示器程序 Chapter7
补充Sales_data没有体现出的其他类特性 Screen.h 1 #include <string> 2 #include <iostream> 3 4 class Scr ...
- [笔记] 《c++ primer》书店程序 Chapter2
Sales_data.h 1 #ifndef SALES_DATA_H 2 #define SALES_DATA_H 3 4 #include "Version_test.h" 5 ...
- C++ Primer 学习笔记_88_用于大型程序的工具 --异常处理[续1]
用于大型程序的工具 --异常处理[续1] 四.又一次抛出 有可能单个catch不能全然处理一个异常.在进行了一些校正行动之后,catch可能确定该异常必须由函数调用链中更上层的函数来处理,catch能 ...
随机推荐
- InlineHook
前言 IATHOOK局限性较大,当我们想HOOK一个普通函数,并不是API,或者IAT表里并没有这个API函数(有可能他自己LoadLibrary,自己加载的),那我们根本就从导入表中找不到这个函数, ...
- 系统编程-信号-信号发送kill、raise、alarm
信号发送 kill 和 raise函数 kill函数参数详解: 实验1 raise和kill 的使用 #include <stdio.h> #include <signal.h> ...
- ABP 适用性改造 - 添加 API 版本化支持
Overview 在前面的文章里有针对 abp 的项目模板进行简化,构建了一个精简的项目模板,在使用过程中,因为我们暴露的 api 需要包含版本信息,我们采取的方式是将 api 的版本号包含在资源的 ...
- kernel base
基础知识 学习网址:ctfwiki 安全客 Kernel:又称核心 维基百科:在计算机科学中是一个用来管理软件发出的数据I/O(输入与输出)要求的电脑程序,将这些要求转译为数据处理的指令并交由中央处理 ...
- 做个开源博客学习Vite2 + Vue3 (一)搭建项目
前言 不会 webpack,遇到报错就一头雾水,完全不知道怎么办,而且体积还大速度还慢. 所以尤雨溪做了 vite 后就很向往,只是知道自己水平有限还是等大佬先趟趟坑,等差不多了在跳. 现在vite2 ...
- matlab通用命令
常用命令 命令 命令说明 cd 显示或改变当前文件夹 dir 显示当前文件夹或指定目录下的文件 clc 清除工作窗中的所有显示内容 home 将光标移至命令行窗口的最左上角 clf 清除图形窗口 ty ...
- SSM完整项目(内含源码)
SSM 电影后台管理项目 概述 通过对数据库中一张表的CRUD,将相应的操作结果渲染到页面上. 笔者通过这篇博客还原了项目(当然有一些隐藏的坑),然后将该项目上传到了Github.Gitee,在末尾会 ...
- Day07_37_深度剖析集合中的contains()方法
深度剖析集合中的 contains()方法 contains()方法查找集合中是否包含某个元素 contains() 底层使用的是 equals()方法 当contains()方法拿到一个对象的时候, ...
- Day07_34_集合概述
集合概述 * 主要集合概述 - 集合相当于现实世界中的容器,主要包含两种存放模式,一个一个的存(Collection), 一对一对存(Map[key,value]) - 集合中只能存储引用数据类型,不 ...
- 前后端分离中的无痛刷新token机制
今天我们来说一说前后端分离中的无痛刷新token机制 博主先来分享一波福利,最近挖到的宝藏,刚开始学Java的同学看 https://www.bilibili.com/video/BV1Rx41187 ...