0
点赞
收藏
分享

微信扫一扫

C++ Primer 第五版 第十四章 练习题编程题目答案


https://github.com/jzplp/Cpp-Primer-Answer

  • 练习14.1
    重载的运算符和内置运算符在对象求值顺序和短路求值属性上不同。
    在优先级和结合律,运算对象的数量上相同。
  • 练习14.2
    Sales_data类 书上的版本
    添加了重载的输入,输出,加法和复合赋值运算符
    14.2 Sales_data.h程序代码14.2 Sales_data.cpp程序代码14.2 测试程序代码
  • 练习14.3
    (a) 使用const char * 的
    (b) 使用string的
    (c) 使用vector的,在vector内部使用string的
    (d) 使用string的
  • 练习14.4
    (a) 非成员
    (b) 成员
    (c) 成员
    (d) 成员
    (e) 非成员
    (f) 非成员
    (g) 非成员
    (h) 成员
  • 练习14.5
    Tree类 自己的简单版本(始于7.40题)
    增加了重载的==运算符
    14.5 Tree.h程序代码14.5 测试程序代码
  • 练习14.6
    Sales_data类 书上的版本
    函数已经在14.2的代码中实现
    14.2 Sales_data.h程序代码14.2 Sales_data.cpp程序代码14.2 测试程序代码
  • 练习14.7
    String类 自己定义 模仿书上的StrVec类
    增加了重载的输出运算符
    14.7 String.h 程序代码14.7 String.cpp 程序代码14.7 测试程序代码
  • 练习14.8
    Tree类 自己的简单版本(始于7.40题)
    增加了重载的输出运算符
    14.8 Tree.h程序代码14.8 测试程序代码
  • 练习14.9
    Sales_data类 书上的版本
    更改为了书上版本的重载输入运算符
    14.9 Sales_data.h程序代码14.9 Sales_data.cpp程序代码14.9 测试程序代码
  • 练习14.10
    (a) 正常读取
    (b) 非正常读取,把书单价设置为了0.95
    (经测试与答案书上结果不同,.95被成功输入为了0.95)
  • 练习14.11
    存在错误
    (a) 正常读取
    (b) 非正常读取,把书单价设置为了0.95
  • 练习14.12
    Tree类 自己的简单版本(始于7.40题)
    增加了重载的输入运算符
    14.12 Tree.h程序代码14.12 测试程序代码
  • 练习14.13
    目前没有想到
  • 练习14.14
  1. 这样在操作上可行,是可以正常运行的
  2. +=和+在逻辑上是类似的运算符,具体的操作也是大部分相同的,如果利用+=来定义+,这样避免了重复定义操作。
  • 练习14.15
    不应该,因为树不应该含有加减乘除等操作
  • 练习14.16
    Sales_data类 书上的版本(题目未要求)
    增加了书上版本的重载相等性运算符
    14.16 Sales_data.h程序代码14.16 Sales_data.cpp程序代码14.16 仅本题测试程序代码
  • StrBlob类 增加了重载相等性运算符
    14.16 StrBlob.h程序代码14.16 StrBlob.cpp程序代码14.16 测试程序代码
  • StrVec类 书上的版本
    增加了重载相等性运算符
    14.16 StrVec.h 程序代码14.16 StrVec.cpp 程序代码14.16 测试程序代码
  • String类 自己定义 模仿书上的StrVec类
    增加了重载相等性运算符
    14.16 String.h 程序代码14.16 String.cpp 程序代码14.16 测试程序代码
  • 练习14.17
    Tree类 自己的简单版本(始于7.40题)
    增加了重载的相等性运算符
    14.17 Tree.h程序代码14.17 测试程序代码
  • 练习14.18
    StrBlob类
    增加了重载关系运算符 改写了重载相等性运算符
    14.18 StrBlob.h程序代码14.18 StrBlob.cpp程序代码14.18 测试程序代码
  • StrVec类 书上的版本
    增加了重载关系运算符
    14.18 StrVec.h 程序代码14.18 StrVec.cpp 程序代码14.18 测试程序代码
  • String类 自己定义 模仿书上的StrVec类
    增加了重载关系运算符
    14.18 String.h 程序代码14.18 String.cpp 程序代码14.18 测试程序代码
  • 练习14.19
    不应该,因为树不应该含有关系运算符
  • 练习14.20
    Sales_data类 书上的版本
    加法运算符已经在之前实现了
    14.16 Sales_data.h程序代码14.16 Sales_data.cpp程序代码14.9 测试程序代码
  • 练习14.21
    Sales_data类 本题代码后续不应采用
    较差版本的加法运算符
    +运算符执行实际的加法操作,而+=调用+,这样会造成定义额外的局部变量,造成额外的资源消耗
    14.21 Sales_data.h程序代码14.21 Sales_data.cpp程序代码14.21 测试程序代码
  • 练习14.22
    Sales_data类 书上的版本
    增加了参数为string的赋值运算符
    14.22 Sales_data.h程序代码14.22 Sales_data.cpp程序代码14.22 仅本题测试程序代码
  • 练习14.23
    StrVec类 书上的版本
    增加了重载花括号列表赋值运算符
    14.23 StrVec.h 程序代码14.23 StrVec.cpp 程序代码14.23 测试程序代码
  • 练习14.24
    不应该。
  • 练习14.25
    不应定义其它赋值运算符。(我偷懒了)
  • 练习14.26
    StrBlob类
    为StrBlob类,StrBlobPtr类,ConstStrBlobPtr类增加了下标运算符
    14.26 StrBlob.h程序代码14.26 StrBlob.cpp程序代码14.26 测试程序代码
  • StrVec类 书上的版本
    增加了下标运算符
    14.26 StrVec.h 程序代码14.26 StrVec.cpp 程序代码14.26 测试程序代码
  • String类 自己定义 模仿书上的StrVec类
    增加了下标运算符
    14.26 String.h 程序代码14.26 String.cpp 程序代码14.26 测试程序代码
  • 练习14.27
    StrBlob类
    为StrBlobPtr类,ConstStrBlobPtr类增加了递增递减运算符
    14.27 StrBlob.h程序代码14.27 StrBlob.cpp程序代码14.27 测试程序代码
  • 练习14.28
    StrBlob类
    为StrBlobPtr类,ConstStrBlobPtr类增加了各类加减运算符
    14.28 StrBlob.h程序代码14.28 StrBlob.cpp程序代码14.28 测试程序代码
  • 练习14.29
    因为递增和递减运算符需要改变类对象,因此const类对象不能进行这种操作
  • 练习14.30
    StrBlob类
    为StrBlobPtr类,ConstStrBlobPtr类增加了解引用和箭头运算符
    14.30 StrBlob.h程序代码14.30 StrBlob.cpp程序代码14.30 测试程序代码
  • 练习14.31
    StrBlobPtr和ConstStrBlobPtr因为weak_ptr只是对指针的弱引用,因此直接销毁不影响指针引用的对象,而且可以随便复制。 所以拷贝构造函数,拷贝复制运算符,析构函数依赖于合成的版本即可
  • 练习14.32
    StrBlob类 仅更改了测试代码
    14.32 StrBlob.h程序代码14.32 StrBlob.cpp程序代码14.32 新建类测试程序代码
  • 练习14.33
    有一个默认的类对象this实参,其他的任意
  • 练习14.34
    重载了函数调用运算符的if-then-else类
    14.34 程序代码
  • 练习14.35
    自己定义的InputString类 仿照书上的PrintString类
    14.35 程序代码
  • 练习14.36
    自己定义的InputString类 仿照书上的PrintString类
    只更改了测试代码
    14.36 程序代码
  • 练习14.37
    检查相等类
    14.37 程序代码
  • 练习14.38
    14.38 程序代码
  • 练习14.39
    14.39 程序代码
  • 练习14.40
    biggies函数 用函数对象类代替lambda
    14.40 程序代码
  • 练习14.41
    因为lambda编写方便,对于小函数很好用
    如果需要保存状态,或者是处理复杂,可以使用函数对象类
  • 练习14.42

(a)
std::count_if(v.begin(), v.end(), std::bind(std::greater<int>(), std::placeholders::_1, 1024));
(b)
std::find_not_if(v.begin(), v.end(), std::bind(std::equal_to<std::string>(), std::placeholders::_1, "pooh"));
(c)
std::tranform(v.begin(), v.end(), v.begin(), std::bind(std::multiplies<int>(),std::placeholders::_1, 2));

  • 练习14.43
    14.43 程序代码
  • 练习14.44
    14.44 简单的二元运算计算器 程序代码
  • 练习14.45
    Sales_data类 书上的版本
    增加了转换为string和double的类型转换运算符
    14.45 Sales_data.h程序代码14.45 Sales_data.cpp程序代码14.45 仅本题测试程序代码
  • 练习14.46
    应该定义,但是必须声明成explicit的。如果是隐式的,可能会造成意外结果
  • 练习14.47

operator const int();
转换为const int类型,并且只能是非常量类对象才能使用
operator int() const;
转换为int类型,常量和非常量类对象都可以使用

  • 练习14.48
    可以定义,但是必须是explicit的,否则可能造成意外结果
  • 练习14.49
    Tree类 自己的简单版本(始于7.40题)
    增加了转换为bool的类型转换运算符
    14.49 Tree.h程序代码14.49 测试程序代码
  • 练习14.50

ex1: 初始化错误  
1. LongDouble转换为double,double转换为int  
2. LongDouble转换为float,float转换为int  
ex2: 初始化正确  
LongDouble到float

  • 练习14.51

可能的类型转换序列:  
1. double转换为LongDouble, 调用void calc(LongDouble)  
2. double转换为int,调用void calc(int)  
最佳可行函数为2,因为通过算术类型的转化比类类型转换的等级要高

  • 练习14.52

ld = si + ld;  
1. SmallInt转换为int,LongDouble转换为double,double转换为int,调用int的加法  
2. SmallInt转换为int,LongDouble转换为float,float转换为int,调用int的加法  
3. SmallInt转换为int,int转换为double,LongDouble转换为double,调用double的加法  
没有哪种方式明确的优于另外的几种,因此会发生错误  

ld = si + ld;  
1. SmallInt转换为int,int转换为double, 调用LongDoule operator+(LongDouble&, double)
2. LongDouble转换为double,SmallInt转换为int,int转换为double,调用double的加法  
3. LongDouble转换为double,double转换为int,SmallInt转换为int,调用int的加法  
4. LongDouble转换为float,float转换为int,SmallInt转换为int,调用int的加法  
5. 调用LongDouble LongDouble::operator(const SmallInt&)
第5种不需要转换,优于其他几种

  • 练习14.53

不合法,会产生二义性
1. s1转换为int,int转换为double,调用double的加法  
2. double转换为int,int转换为SmallInt,调用SmallInt SmallInt::operator(const SmallInt&, const SmallInt&)
修改的方式有很多种,其中一种为:
double d = int(s1) + 3.14;

举报

相关推荐

0 条评论