c++ primer练习题 第七章 类 (Class)
练习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)相关推荐
- 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 节的 ...
- C++ Primer Plus 第七章编程题练习
C++ Primer Plus 第七章编程题练习 第一题 题目描述 编写一个程序,不断要求用户输入两个数,直到其中的一个为0.对于每两个数,程序将使用一个 函数来计算它们的调和平均数,并将结果返回给m ...
- 第七个猴子java_黑猴子的家:Java SE 练习题第七章
尾部都有答案 第七章练习题(多态) (1)下列自'关多态的叙述正确的是哪项?(选两项) A. 父类的引用指向子类的实例是一种多态 B. 子类的引用指向子类的实例是一种多态 C. 接口的引用指向实现该接 ...
- C#图解教程 第七章 类和继承
类和继承 类继承 访问继承的成员 所有类都派生自object类 屏蔽基类的成员 基类访问 使用基类的引用 虚方法和覆写方法 覆写标记为override的方法 覆盖其他成员类型 构造函数的执行 构造函数 ...
- C++学习之路(六),C++primer plus 第七章 函数--C++的编程模块
第 7 章 函数---C++的编程模块 本章内容包括: 函数基本知识. 函数原型. 按值传递函数参数. 设计处理数组的函数. 使用 const 指针参数. 设计处理文本字符串的函数. 设计处理结构的函 ...
- C++ Primer plus 第12章类和动态内存分配复习题参考答案
假设String类有如下私有成员 class String { private:char* str; //points to string allocated by newint len; //hol ...
- 【C++ Primer】第十三章 类继承
一,类继承 定义:从已有的类派生出新的类,而派生类继承了原有类的特征,包括方法. 目标:提供可重用的代码 二,一个简单的基类 #include <iostream ...
- 第七章 - 类的详细设计
该部分在实际应用中很重要,当然考试也将其作为重点内容进行考察. 详细设计的定义 详细设计是以概要设计说明书作为基础,完成各模块的算法设计.用户界面设计以及数据结构设计的细化等. 对于开发者来说详细设计 ...
- 【C++ primer】第七章 函数-C++的编程模块
1,函数的基本知识 C++对于返回值的类型有一定的限制:不能是数组,但可以使其他任何类型,甚至可以使结构和对象. 有趣的是,虽然数组不可以作为返回对象,但是数组可以作为结构 ...
最新文章
- 扩增子分析流程1. QIIME虚拟机安装配置及挂载外部目录
- 英特尔也决定了!正式退出5G智能型手机
- (转)Go语言核心36讲之Go语言入门基础知识
- 字符串中不重复字符出现第一次的位置
- 偏微分方程I PDE的例子1 一维波动与热传导方程
- idea的maven project消失解决方案
- 2018北大计算机复试线,2018年北京大学考研复试分数线已公布
- Windows Server 2012 之部署Windows Server 更新服务(1)
- ubantu 安装anaconad_Ubuntu16.04安装Anaconda (转)
- 【解决方案】施工现场如何实现全方位视频监控?EasyGBS视频智能告警分析平台搭建智慧工地
- 三调数据库标注插件v1.3
- nginx-rtmp协议解读
- java layoutinflater_安卓 LayoutInflater详解
- c语言鸽笼原理,技巧丨弄懂抽屉原理
- Android 使用三级缓存实现对图片的加载
- CodeForces - 1485D Multiples and Power Differences (构造+lcm)
- 刚刚!华为突然传来这一消息,我想辞职回家养猪了!
- 实现app第一次安装浮层引导View!
- 极客日报:微信正式宣布开放外部链接;iPhone13预购开启导致苹果官网崩了;特斯拉将向车主提供新版 FSD
- 【pandas】统计指标
热门文章
- 【实战高保真】电商saas全套原型、店铺管理、店铺装修、商品管理、会员管理、维权管理、会员管理、营销管理、财务管理、渠道管理、saas系统、Axure高保真后台管理原型、rp源文件、axure原型
- Codeforces 938.C Constructing Tests
- iOS数据持久化 -- Core Data
- 2017/05/11读性能测试书籍后感
- SQL Server存储过程中使用表值作为输入参数示例
- Eclipse中使用Git-让版本管理更简单
- .c和.h文件的区别(转载)
- 第23章:MongoDB-聚合操作--聚合命令
- C语言复杂声明解读简明方法
- 卸载loadrunner