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 节的练习(第 76 页)中编写了一个 Sales_data类,请向这个类添加 combine 和 isbn 成员。
创建头文件sales.h
#ifndef SALES_H
#define SALES_H#include <string>
#include <stdlib.h>
using namespace std;struct Sales_data
{string isbn() const //返回书的编号{return bookNo;}Sales_data& combine(const Sales_data& rhs);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.units_sold;return *this;
}
#endif;
练习7.3
修改 7.1.1 节(第 229 页)的交易处理程序,令其使用这些成员。
#include <iostream>
using namespace std;
#include "sales.h"
#include <string>//读取销售记录,生成每本书的销售报告,显示售出册数、总销售额和平均售价
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;total = trans;}}cout << total.bookNo << " 的总销售记录是:共售出 " << total.units_sold << " 本,总收入是 " << total.revenue << " 平均每本价格是 "<<total.revenue/total.units_sold;}
}
练习7.4
编写一个名为 Person 的类,使其表示人员的姓名和住址。使用 string 对象存放这些元素,接下来的练习将不断充实这个类的其他特征。
创建头文件person.h
#pragma once
#include<string>
using namespace std;
struct Person {string Name;string Address;
};
练习7.6
对于函数 add、read、和 print,定义你自己的版本。
创建头文件sales.h
#ifndef SALES_H
#define SALES_H#include <string>
#include <stdlib.h>
using namespace std;struct Sales_data
{string isbn() const{return bookNo;}Sales_data& combine(const Sales_data& rhs);istream& read(istream& is, Sales_data& item);ostream& print(ostream& os, Sales_data& item);Sales_data add(const Sales_data& lhs, const Sales_data& rhs);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.units_sold;return *this;
}
istream& Sales_data::read(istream& is, Sales_data& item) //is用来代替cin,istream类和ostream类见后续的IO类型
{double price;is >> item.bookNo >> item.units_sold >> price;item.revenue = price * item.units_sold;return is;
}
ostream& Sales_data::print(ostream& os, Sales_data& item)
{os << item.isbn() << " 的总销售记录是:共售出 " << item.units_sold << " 本,总收入是 "<< item.revenue << " " << " 平均每本价格是 "<<item.revenue/item.units_sold;return os;
}
Sales_data Sales_data::add(const Sales_data& lhs, const Sales_data& rhs)
{Sales_data sum = lhs; //把lhs的数据成员拷贝给sumsum.combine(rhs); //把rhs的数据成员加到sum中return sum;
}#endif;
练习7.7
使用这些新函数重写 7.1.2 节(第 233 页)练习中的交易处理程序。
#include <iostream>
using namespace std;
#include "sales.h"
#include <string>//读取销售记录,生成每本书的销售报告,显示售出册数、总销售额和平均售价
int main()
{Sales_data total; if (total.read(cin,total)){Sales_data trans;while (total.read(cin,trans)){if (total.isbn() == trans.isbn())total.combine(trans);else{total.print(cout,total);cout << endl;total = trans;}}total.print(cout, total);cout << endl;}
}
练习7.9
对于 7.1.2节(第 233 页)练习中的代码,添加读取和打印 Person 对象的操作。
#pragma once
#include <string>
#include <iostream>
using namespace std;struct Person {string Name;string Address;istream& read(istream& is, Person& per);ostream& print(ostream& os, const Person& per);};
istream& Person::read(istream& is, Person& per)
{is >> per.Name >> per.Address;return is;
}ostream& Person::print(ostream& os, const Person& per)
{os << "名字为:" << per.Name << " 地址为:" << per.Address;return os;
}
练习7.14、7.15、7.22
7.14.编写一个构造函数,令其用我们提供的类内初始值显式地初始化成员。
7.15.为你的 Person 类添加正确的构造函数。
7.22.修改你的 Person 类使其隐藏实现的细节。
头文件
#pragma once
#include <string>
#include <iostream>
using namespace std;
'''构造函数可以有多个,发生了重载,实例化的时候只能调用一个'''
class Person
{public://1、无参构造函数,可以直接Person p创建实例Person() = default; //2、无参显示构造,可以直接Person p创建实例,和默认无参构造无法发生重载Person():Name("megumi"),Address("japan"){} //3、有参构造函数,需要Person p("sanae","erci")创建实例Person(string N, string A) :Name(N), Address(A) {} //4、类外构造函数的声明Person(istream& is);istream& read(istream& is, Person& per); //读取函数ostream& print(ostream& os, const Person& per); //输出函数
private:string Name;string Address;
};//类外构造函数的定义
Person::Person(istream &is)
{read(is,*this);
}istream& Person::read(istream& is, Person& per)
{is >> per.Name >> per.Address;return is;
}ostream& Person::print(ostream& os, const Person& per)
{os << "名字为:" << per.Name << " 地址为:" << per.Address;return os;
}
主程序
#include <iostream>
using namespace std;
#include "person.h"
int main()
{//1和2采用这种实例化Person per;per.print(cout, per);cout<<endl;//3采用这种实例化Person per1("sanae","beijing");per1.print(cout,per1);cout<<endl;//4类外构造函数的使用Person per2(cin);per2.print(cout,per2);}
练习7.23、7.24、7.26
头文件screen.h
#pragma once
#include <string>
#include <iostream>
using namespace std;class Screen
{public:typedef string::size_type pos;Screen() = default;Screen(pos ht, pos wd) :height(ht), width(wd) { }Screen(pos ht,pos wd,char c):height(ht),width(wd),contents(ht*wd,c) { }char get() const //读取光标处的字符{return contents[cursor]; //隐式内联}inline char get(pos ht, pos wd) const; //显示内联Screen& move(pos r, pos c); //能在之后被设为内联private:pos cursor = 0;pos height = 0, width = 0;string contents;
};
char Screen::get(pos r, pos c) const
{pos row = r * width;return contents[row + c];
}
inline Screen& Screen::move(pos r, pos c) //内联,最好用这种方法,容易理解
{pos row = r * width;cursor = row + c;return *this;
}
练习7.27
头文件screen.h
#pragma once
#include <string>
#include <iostream>
using namespace std;class Screen
{public:typedef string::size_type pos;Screen() = default;Screen(pos ht, pos wd) :height(ht), width(wd) { }Screen(pos ht,pos wd,char c):height(ht),width(wd),contents(ht*wd,c) { }char get() const //读取光标处的字符{return contents[cursor]; //隐式内联}inline char get(pos ht, pos wd) const; //显示内联Screen& move(pos r, pos c); //负责移动光标,能在之后被设为内联Screen& set(char);Screen& set(pos r, pos col, char ch);Screen& display(ostream& os){do_display(os);return *this;}const Screen& display(ostream& os) const{do_display(os);return *this;}private:pos cursor = 0; //光标的位置pos height = 0, width = 0; //屏幕的宽高string contents; //存放数据//该函数负责显示Screen的内容void do_display(ostream& os) const{os << contents;}
};
char Screen::get(pos r, pos c) const
{pos row = r * width;return contents[row + c];
}
inline Screen& Screen::move(pos r, pos c) //内联,最好用这种方法,容易理解
{pos row = r * width;cursor = row + c;return *this;
}
inline Screen& Screen::set(char c)
{contents[cursor] = c; //设置当前光标所在位置的新值return *this; //将this对象作为左值返回
}
inline Screen& Screen::set(pos r, pos col, char ch)
{contents[r * width + col] = ch; //设置给定位置的新值return *this; //将this对象作为左值返回
}
主程序
#include "screen.h"int main()
{Screen myScreen(5, 5, 'x'); //创建一个有5*5个x的对象myScreen.move(4, 0).set('#').display(cout);//移动光标4*5+0下,把那个位置的x替换成#,并且显示出来cout << '\n';myScreen.display(cout);cout << '\n';
}
结果为:
xxxxxxxxxxxxxxxxxxxx#xxxx
xxxxxxxxxxxxxxxxxxxx#xxxx
C++ Primer(第五版)第七章 类 部分答案相关推荐
- C++ Primer 第五版 第7章类 7.1——类讲解(成员函数、非成员函数、构造函数)习题答案
理论讲解请参考:C++ Primer 第五版 第7章类 7.1--类讲解(成员函数.非成员函数.构造函数) 目录 7.1 定义抽象数据类型习题答案 7.4&7.5 7.6&7.7 7. ...
- C++ Primer 第五版 第7章类 7.1——类讲解(成员函数、非成员函数、构造函数)
习题答案请参考:C++ Primer 第五版 第7章类 7.1--类讲解(成员函数.非成员函数.构造函数)习题答案 目录 7.1 类讲解(成员函数.非成员函数.构造函数) 成员函数 this cons ...
- C++ Primer 第五版 第8章类 8.2——文件输入和输出
目录 8.2 文件输入和输出 fstream头文件 fstream特有的操作 输出文件(写入文件) 输入文件(读取文件) 成员函数open和close 流状态检查和is_open() 文件模式 程序实 ...
- C++ Primer 第五版 第6章——函数阅读笔记及习题答案(完整,附C++代码)
C++Primer(第五版)第6章函数的阅读笔记及课后习题答案总结,课后习题答案是自己学习写出来的,如果有误,欢迎指正 还不完整,后续会更新添加 阅读笔记 C++ Primer 第五版 第6章 6.1 ...
- C++ Primer 第五版 第6章 6.7——函数指针习题答案
理论请参考:C++ Primer 第五版 第6章 6.7--函数指针阅读笔记 目录 6.7 函数指针习题答案 6.54 6.55 6.56 6.7 函数指针习题答案 6.54 vector是指向该函数 ...
- C++ Primer 第五版 第6章 6.7——函数指针阅读笔记
习题答案请参考:C++ Primer 第五版 第6章 6.7--函数指针习题答案 目录 6.7 函数指针 使用函数指针 返回指向函数的指针 6.7 函数指针 声明一个函数指针,只需要用指针替代函数名即 ...
- C++ Primer 第五版 第6章 6.3——函数返回类型和return语句阅读笔记
习题答案请参考:C++ Primer 第五版 第6章 6.3--函数返回类型和return语句习题答案 目录 6.3 返回类型和return语句 6.3.1 无返回值函数 无返回值函数的特性 6.3. ...
- C++ Primer 第五版 第6章 6.3——函数返回类型和return语句习题答案
理论讲解请参考:C++ Primer 第五版 第6章 6.3--函数返回类型和return语句阅读笔记 目录 6.31 6.32 6.33 6.34 6.35 6.36 6.38 6.31 返回引用无 ...
- C++ Primer 第五版 第6章 6.2——函数参数传递习题答案
理论讲解请参考:C++ Primer 第五版 第6章 6.2--函数参数传递阅读笔记 目录 6.10 指针形参交换两个数 6.12 引用形参交换两个数 6.13 6.14 6.15 6.16 6.17 ...
最新文章
- linux 内核调整相关参数
- 记GMIC 2014
- 优秀自我简介200字_全球战疫 翰墨传情——东方盛世杯网络公益书画展优秀作品【二】...
- 清除元素中的子元素html_HTML中的元素简介
- python入门之函数调用第三关-Python 基础3 函数function
- Less/Sass 定制私人常用方法库
- 翻译:响应式编程或反应式编程 RxSwift和RxCocoa 从入门到精通 Reactive programming
- JSESSIONID 作用
- .NET Standard(1)——.NET Standard是什么
- phonegap app推送新手教程与坑
- 小米电视看普通电视台,只需几步就能轻松解锁
- Minecraft 1.12.2模组开发(四十五) 水火两用船
- 搞定java面试系列--jvm3 gc垃圾回收
- Vue+ .netcore3.1 模拟QQ邮箱发送验证码
- java.lang.IllegalArgumentException: java.security.InvalidKeyException: Illegal key siz
- 逆变器阻抗扫描 扫频法 阻抗扫描 阻抗建模验证
- 三分钟部署Laxcus大数据管理系统
- IPv6技术精要--第9章 无状态地址自动配置SLACC
- 一次制作U盘启动盘并安装WIN7系统的经历
- 38外观数列(循环遍历)
热门文章
- linux 延时一微秒_让我们暂停一微秒
- HATEOAS的RESTful服务。 记录超媒体API
- java rmi 使用管道_使用Java RMI时要记住的两件事
- spring javafx_带有Spring的JavaFX 2
- couchbase_Couchbase 2.0归类视图简介
- Spring Web-Flux – Cassandra后端的功能样式
- java程序打包为jar_将Java应用程序打包为一个(或胖)JAR
- Java向后不兼容历史的观察
- 为Twitter4j创建自定义SpringBoot Starter
- Sacrilege –自定义SWT滚动条