《C++ Primer》7.5.1节练习
练习7.36:
在类X中,两个数据成员出现的顺序是rem在前,base在后,所以当执行X对象的初始化操作时先初始化rem。如上述代码所示,初始化rem要用到base的值,而此时base尚未被初始化,因此会出现错误。该过程与构造函数初始值列表中谁出现在前面谁出现在后面没有任何关系。
修改的方法很简单,只需要把变量rem和base的次序调换即可,形式是:
struct X
{X(int i,int j):base(i),rem(base%j){}int base,rem;
};
练习7.37:
Sales_data first_item(cin);使用了接受std::istream&参数的构造函数,该对象的成员值依赖于用户的输入。
Sales_data next;使用了Sales_data的默认构造函数,其中string类型的成员bookNo默认初始化为空字符串,其他几个成员使用类内初始值初始化为0。
Sales_data last(“9-999-99999-9”);使用了接受const string&参数的构造函数,其中bookNo使用实参初始化为"9-999-99999-9",其他几个成员使用类内初始值初始化为0。
练习7.37:
满足题意的构造函数如下所示:
Sales_data(std::istream&is = std::cin){is>>*this;}
此时该函数具有了默认构造函数的作用,因此我们原来声明的默认构造函数Sales_data()= default;应该去掉,否则会引起调用的二义性。
练习7.39:
如果我们为构造函数的全部形参都提供了默认实参(包括为只接受一个形参的构造函数提供默认实参),则该构造函数同时具备了默认构造函数的作用。此时即使我们不提供任何实参地创建类的对象,也可以找到可用的构造函数。
然而,如果按照本题的叙述,我们为两个构造函数同样都赋予了默认实参,则这两个构造函数都具有了默认构造函数的作用。一旦我们不提供任何实参地创建类的对象,则编译器无法判断这两个(重载的)构造函数哪个更好,从而出现了二义性错误。
练习7.40:
首先选择(a)Book,一本书通常包含书名、ISBN编号、定价、作者、出版社等信息,因此令其数据成员为:Name、ISBN、Price、Author、Publisher,其中Price是double类型,其他都是string类型。Book的构造函数有三个:一个默认构造函数、一个包含完整书籍信息的构造函数和一个接受用户输入的构造函数。其定义如下:
class Book
{private:string Name,ISBN,Author,Publisher;double Price = 0;public:Book() = default;Book(const string &n,const string &I,double pr,const string &a,const string &p){Name = n;ISBN = I;Price = pr;Author = a;Publisher = p;}Book(std::istream&is){is>>*this;}
};
也可以选择(f)Tree,一棵树通常包含树的名称、存活年份、树高等信息,因此令其数据成员为:Name、Age、Height,其中Name是string类型,Age是unsigned类型,Height是double类型。假如我们不希望由用户输入Tree的信息,则可以去掉接受std::istream&形参的构造函数,只保留默认构造函数和接受全部信息的构造函数。其定义如下:
class Tree
{private:string Name;unsigned Age = 0;double Height = 0;public:Tree() = default;Tree(const string &n,unsigned a,double h):Name(n),Age(a),Height(h);
}
《C++ Primer》7.5.1节练习相关推荐
- C++primer 9.2.1节练习
练习9.3 迭代器begin和end必须指向相同的容器,end可以与begin指向相同的位置,但不能指向begin之前的位置: 练习9.4 1 #include <iostream> 2 ...
- C++primer 10.2.1节练习
练习10.3 1 #include<iostream> 2 #include<string> 3 #include<vector> 4 #include <s ...
- C++primer 13.1.6节练习
练习13.18 1 #include <iostream> 2 #include <string> 3 #include <memory> 4 5 using na ...
- 《C++ Primer》10.1节练习
练习10.1: #include <iostream> #include <vector> #include <algorithm> using namespace ...
- 《C++ Primer》14.4节练习(部分)
练习14.20: class Sales_data {friend Sales_data operator+(const Sales_data &lhs,const Sales_data &a ...
- 《C++ Primer》14.3节练习
练习14.13: 对于Sales_data类,其实我们并不需要再为它添加其他算术运算符.但是这里我们可以考虑为它实现一个减法运算符. class Sales_data {friend Sales_da ...
- 《C++ Primer》14.1节练习
练习14.1: 不同点: 重载操作符必须具有至少一个class或枚举类型的操作数. 重载操作符不保证操作数的求值顺序,例如对&&和||的重载版本不再具有"短路求值" ...
- 《C++ Primer》7.4节练习
练习7.33: 题目代码: pos Screen::size()const {return height*width; } 如果添加如题目所示的size函数将会出现编译错误.因为该函数的返回类型pos ...
- 《C++ Primer》7.2节练习
练习7.16: 在类的定义中,可以包含0个或者多个访问说明符,并且对于某个访问说明符能出现多少次以及能出现在哪里都没有严格规定.每个访问说明符指定接下来的成员的访问级别,有效范围直到出现下一个访问说明 ...
- 《C++ Primer》1.51节练习
练习1.20 #include <iostream> #include "Sales_item.h" using namespace std;int main() {S ...
最新文章
- 不同语言同时编译的问题
- boost::lexical_cast
- 【C/C++开发】C++实现字符串替换的两种方法
- Linux内核小笔记:spin_lock锁内不能使用sleep休眠
- 【剑指 offer】(二十二)—— 栈的压入、弹出序列
- 二十四、通过用户模型,对数据库进行增删改查操作
- freeswitch 使用mysql替换默认的sqlite
- mcinabox运行库下载_MCinaBox运行库
- python图标中文_解决python中matplotlib中文乱码 for Mac
- JPBC库应用之身份基加密IBE
- 高并发系统设计 --基于MySQL构建评论系统
- (31)2021-01-20(JSON字符串和本地存储)
- Linux解决txt文件乱码问题
- 苹果电脑带有双系统Mac/Win,如何更改默认启动系统?
- Hantek6022BE 虚拟示波器 (二)方波 采样率 带宽
- 02 MSC类设备-基础篇(二)
- Java获取某年某周的第一天
- Android NV21与Bitmap相互转换 可实时添加水印
- 终极孵化器:仿生婴儿的美丽新世界
- bios设置识别linux硬盘,linux下如何查看硬盘插在主板那个SATA接口上?梅捷主板SY-A77M3+ bios设置 咋设置啊...
热门文章
- 【ArcGIS遇上Python】Python批量将多个文件夹下的多个影像数据镶嵌至新栅格
- T-SQL编程基础之二:条件选择、循环编程
- 你为什么不爱发朋友圈了?
- 每日一笑 | 为什么英语老师让我们养成背单词的习惯?
- 一堂儿童科学实验课引起的思考:数学和化学有什么关系?
- 嘘!偷偷教你们一个在双十一省钱的办法!
- 《SAS编程与数据挖掘商业案例》学习笔记之十四
- 有计算机信号专业吗,计算机医学图像及信号处理
- bpmn文件的标签为何都以bpmn2开头_C语言之两种作用域:函数的作用域与文件作用域...
- 在google play开放平台上closed texting如何删除_“爷青回”!如何抢先体验《英雄联盟》手游?这份攻略送给你...