练习7.1 使用2.6.1节定义的Sales_data类为1.6节的交易处理程序编写一个新版本。
解:

#include <iostream>
#include <string>
using std::cin; using std::cout; using std::endl; using std::string;struct Sales_data
{string bookNo;unsigned units_sold = 0;double revenue = 0.0;
};int main()
{Sales_data total;if (cin >> total.bookNo >> total.units_sold >> total.revenue){Sales_data trans;while (cin >> trans.bookNo >> trans.units_sold >> trans.revenue) {if (total.bookNo == trans.bookNo) {total.units_sold += trans.units_sold;total.revenue += trans.revenue;}else{cout << total.bookNo << " " << total.units_sold << " " << total.revenue << endl;total = trans;}}cout << total.bookNo << " " << total.units_sold << " " << total.revenue << endl;}else{std::cerr << "No data?!" << std::endl;return -1;}return 0;
}

练习7.2 曾在2.6.2节的练习中编写了一个Sales_data类,请向这个类添加combine函数和isbn成员。
解:

#include <string>struct Sales_data {std::string isbn() const { return bookNo; };Sales_data& combine(const Sales_data&);std::string bookNo;unsigned units_sold = 0;double revenue = 0.0;
};Sales_data& Sales_data::combine(const Sales_data& rhs)
{units_sold += rhs.units_sold;revenue += rhs.revenue;return *this;
}

练习7.3 修改7.1.1节的交易处理程序,令其使用这些成员。
解:

#include <iostream>
using std::cin; using std::cout; using std::endl;int main()
{Sales_data total;if (cin >> total.bookNo >> total.units_sold >> total.revenue){Sales_data trans;while (cin >> trans.bookNo >> trans.units_sold >> trans.revenue) {if (total.isbn() == trans.isbn())total.combine(trans);else {cout << total.bookNo << " " << total.units_sold << " " << total.revenue << endl;total = trans;}}cout << total.bookNo << " " << total.units_sold << " " << total.revenue << endl;}else{std::cerr << "No data?!" << std::endl;return -1;}return 0;
}

练习7.4 编写一个名为Person的类,使其表示人员的姓名和地址。使用string对象存放这些元素,接下来的练习将不断充实这个类的其他特征。
解:

#include <string>class Person {std::string name;std::string address;
};

练习7.5 在你的Person类中提供一些操作使其能够返回姓名和地址。 这些函数是否应该是const的呢?解释原因。
解:

#include <string>class Person
{std::string name;std::string address;
public:auto get_name() const -> std::string const& { return name; }auto get_addr() const -> std::string const& { return address; }
};

应该是const的。因为常量的Person对象也需要使用这些函数操作。

练习7.6 对于函数add、read和print,定义你自己的版本。
解:

#include <string>
#include <iostream>struct Sales_data {std::string const& isbn() const { return bookNo; };Sales_data& combine(const Sales_data&);std::string bookNo;unsigned units_sold = 0;double revenue = 0.0;
};// member functions.
Sales_data& Sales_data::combine(const Sales_data& rhs)
{units_sold += rhs.units_sold;revenue += rhs.revenue;return *this;
}// nonmember functions
std::istream &read(std::istream &is, Sales_data &item)
{double price = 0;is >> item.bookNo >> item.units_sold >> price;item.revenue = price * item.units_sold;return is;
}std::ostream &print(std::ostream &os, const Sales_data &item)
{os << item.isbn() << " " << item.units_sold << " " << item.revenue;return os;
}Sales_data add(const Sales_data &lhs, const Sales_data &rhs)
{Sales_data sum = lhs;sum.combine(rhs);return sum;
}

练习7.7 使用这些新函数重写7.1.2节练习中的程序

int main()
{Sales_data total;if (read(std::cin, total)){Sales_data trans;while (read(std::cin, trans)) {if (total.isbn() == trans.isbn())total.combine(trans);else {print(std::cout, total) << std::endl;total = trans;}}print(std::cout, total) << std::endl;}else{std::cerr << "No data?!" << std::endl;return -1;}return 0;
}

练习7.8 为什么read函数将其Sales_data参数定义成普通的引用,而print函数将其参数定义成常量引用?
解: 因为read函数会改变对象的内容,而print函数不会。

练习7.9 对于7.1.2节练习中代码,添加读取和打印Person对象的操作。

#include <string>
#include <iostream>struct Person
{std::string const& getName()    const { return name; }std::string const& getAddress() const { return address; }std::string name;std::string address;
};std::istream &read(std::istream &is, Person &person)
{return is >> person.name >> person.address;
}std::ostream &print(std::ostream &os, const Person &person)
{return os << person.name << " " << person.address;
}

练习7.10 在下面这条if语句中,条件部分的作用是什么?

if (read(read(cin, data1), data2)) //等价read(std::cin, data1);read(std::cin, data2);

read函数的返回值是istream对象, if语句中条件部分的作用是从输入流中读取数据给两个data对象。

c++ primer练习题 第七章 类 (Class)相关推荐

  1. C++ Primer(第五版)第七章 类 部分答案

    第七章 类 练习7.2 练习7.3 练习7.4 练习7.6 练习7.7 练习7.9 练习7.14.7.15.7.22 练习7.23.7.24.7.26 练习7.27 练习7.2 曾在 2.6.2 节的 ...

  2. C++ Primer Plus 第七章编程题练习

    C++ Primer Plus 第七章编程题练习 第一题 题目描述 编写一个程序,不断要求用户输入两个数,直到其中的一个为0.对于每两个数,程序将使用一个 函数来计算它们的调和平均数,并将结果返回给m ...

  3. 第七个猴子java_黑猴子的家:Java SE 练习题第七章

    尾部都有答案 第七章练习题(多态) (1)下列自'关多态的叙述正确的是哪项?(选两项) A. 父类的引用指向子类的实例是一种多态 B. 子类的引用指向子类的实例是一种多态 C. 接口的引用指向实现该接 ...

  4. C#图解教程 第七章 类和继承

    类和继承 类继承 访问继承的成员 所有类都派生自object类 屏蔽基类的成员 基类访问 使用基类的引用 虚方法和覆写方法 覆写标记为override的方法 覆盖其他成员类型 构造函数的执行 构造函数 ...

  5. C++学习之路(六),C++primer plus 第七章 函数--C++的编程模块

    第 7 章 函数---C++的编程模块 本章内容包括: 函数基本知识. 函数原型. 按值传递函数参数. 设计处理数组的函数. 使用 const 指针参数. 设计处理文本字符串的函数. 设计处理结构的函 ...

  6. C++ Primer plus 第12章类和动态内存分配复习题参考答案

    假设String类有如下私有成员 class String { private:char* str; //points to string allocated by newint len; //hol ...

  7. 【C++ Primer】第十三章 类继承

    一,类继承         定义:从已有的类派生出新的类,而派生类继承了原有类的特征,包括方法.         目标:提供可重用的代码 二,一个简单的基类 #include <iostream ...

  8. 第七章 - 类的详细设计

    该部分在实际应用中很重要,当然考试也将其作为重点内容进行考察. 详细设计的定义 详细设计是以概要设计说明书作为基础,完成各模块的算法设计.用户界面设计以及数据结构设计的细化等. 对于开发者来说详细设计 ...

  9. 【C++ primer】第七章 函数-C++的编程模块

    1,函数的基本知识        C++对于返回值的类型有一定的限制:不能是数组,但可以使其他任何类型,甚至可以使结构和对象.        有趣的是,虽然数组不可以作为返回对象,但是数组可以作为结构 ...

最新文章

  1. 扩增子分析流程1. QIIME虚拟机安装配置及挂载外部目录
  2. 英特尔也决定了!正式退出5G智能型手机
  3. (转)Go语言核心36讲之Go语言入门基础知识
  4. 字符串中不重复字符出现第一次的位置
  5. 偏微分方程I PDE的例子1 一维波动与热传导方程
  6. idea的maven project消失解决方案
  7. 2018北大计算机复试线,2018年北京大学考研复试分数线已公布
  8. Windows Server 2012 之部署Windows Server 更新服务(1)
  9. ubantu 安装anaconad_Ubuntu16.04安装Anaconda (转)
  10. 【解决方案】施工现场如何实现全方位视频监控?EasyGBS视频智能告警分析平台搭建智慧工地
  11. 三调数据库标注插件v1.3
  12. nginx-rtmp协议解读
  13. java layoutinflater_安卓 LayoutInflater详解
  14. c语言鸽笼原理,技巧丨弄懂抽屉原理
  15. Android 使用三级缓存实现对图片的加载
  16. CodeForces - 1485D Multiples and Power Differences (构造+lcm)
  17. 刚刚!华为突然传来这一消息,我想辞职回家养猪了!
  18. 实现app第一次安装浮层引导View!
  19. 极客日报:微信正式宣布开放外部链接;iPhone13预购开启导致苹果官网崩了;特斯拉将向车主提供新版 FSD
  20. 【pandas】统计指标

热门文章

  1. 【实战高保真】电商saas全套原型、店铺管理、店铺装修、商品管理、会员管理、维权管理、会员管理、营销管理、财务管理、渠道管理、saas系统、Axure高保真后台管理原型、rp源文件、axure原型
  2. Codeforces 938.C Constructing Tests
  3. iOS数据持久化 -- Core Data
  4. 2017/05/11读性能测试书籍后感
  5. SQL Server存储过程中使用表值作为输入参数示例
  6. Eclipse中使用Git-让版本管理更简单
  7. .c和.h文件的区别(转载)
  8. 第23章:MongoDB-聚合操作--聚合命令
  9. C语言复杂声明解读简明方法
  10. 卸载loadrunner