概述
7.33 pos位于类的作用域之外,无法直接使用,应改为Screen::pos。
7.34 放在最后一行无法通过编译,声明中使用的名字,包括返回类型和参数列表使用的名字,都必须在使用前确保可见。
7.35
typedef string Type;
Type iniVal();
//Type为string
class Exercise {
public:
typedef double Type;
Type setVal(Type);
//返回类型和形参类型都使用类内声明,为double
Type iniVal();
//隐藏了类外部定义的iniVal()
private:
int val;
};
/* 返回类型Type使用了类外部的声明,为string,
应该使用Exercise::Type
参数Type已经处于类作用域内,为double
*/
Type Exercise::setVal(Type parm)
{
val = parm + initVal();
//initVal使用类成员函数iniVal()
return val;
}
7.36 初始化顺序与它们在类定义中出现的顺序一致,rem先初始化,此时base未初始化,应使用rem(i % j),或者调换rem和base定义的次序。
7.37 first_item使用接受std::istream&参数的构造函数;next使用默认构造函数,即使用默认实参""的构造函数,其他成员为0;last和next使用相同的构造函数,使用传入的实参"9-999-99999-9",其他成员为0.
7.38 Sales_data(std::istream &is = std::cin) { read(is, *this); }
7.39 不合法,会出现二义性错误。
7.40 例如选择(b) Date,数据成员包括year, month, day,需要一个默认构造函数,用户输入的构造函数,接收3个unsigned int类型的构造函数。
7.41
class Sales_data {
public:
Sales_data(const string &s, unsigned n, double p):
bookNo(s), units_sold(n), revenue(p) { cout << "3 param" << endl; }
Sales_data(): Sales_data("", 0, 0) { cout << "0 param" << endl;}
Sales_data(const string &s): Sales_data(s, 0, 0) { cout << "1 string param" << endl; }
Sales_data(istream &is): Sales_data() { cout << "istream param" << endl; read(is, *this); }
/* ... */
private:
string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
7.42 以Date类为例,可以选择3个参数的构造函数作为委托构造函数。
7.43 可以给C的构造函数设置一个int型的默认实参:
class NoDefault {
public:
NoDefault(int);
/* ... */
};
class C {
public:
C(int i = 0): n(i) { }
private:
NoDefault n;
};
7.44 不合法,创建一个vector,包含10个NoDefault对象并执行默认初始化,但NoDefault类没有默认构造函数,无法执行。
7.45 元素类型为C则合法,C有默认构造函数。
7.46 (a) 错误,可以不提供构造函数,编译器会合成默认构造函数;
(b) 错误,可以不为空,可以包含默认实参;
(c) 错误,没有默认构造函数,某些情况下该类无法使用;
(d) 错误,如果定义了其他构造函数,编译器不会合成默认构造函数。
7.47 应该是explict的,避免string到Sales_data的隐式转换造成错误。
7.48 item1和item2都执行接受const string&参数的构造函数创建对象。
7.49 (a)用s创建一个Sales_data对象并作为形参传递给函数;
(b)s创建了一个Sales_data临时量,但临时量无法传递给非常量引用,所以是非法的,
应该把参数改为常量引用const Sales_data&;
(c)被声明位常量成员函数,无法修改成员的值,所以是非法的。
7.50 需要多个实参的构造函数不能用于隐式转换,无需指定explict;
接受单个参数,例如std::istream&,应该指定为explict的。
7.51 vector定义为explict的,明确其指定的是容量,而不是值,因此定义成explict的。
7.52 Sales_data作为聚合类,不能有类内初始值,应该把2.6.1节的类内初始值去掉。
7.53 参考书中的示例。
7.54 不能,set_开头的成员函数用于设置成员的值,而constexpr函数只能包含return语句,不能有其他操作。
7.55 是字面值常量类,数据成员都是字面值类型的聚合类也是字面值常量类。
7.56 类的成员声明之前加上关键字static称为静态成员,类的静态成员存在于任何对象之外,可由该类的全体对象共享,对象中不包含任何与静态数据成员有关的数据。
7.57 参考书中的示例。
7.58 对非常量的静态成员必须在类的外部定义和初始化,rate和vec的初始化应该在类的外部,应改为:
//example.h
class Example {
static double rate;
static const int vecSize = 20;
static vector<double> vec(vecSize);
};
//example.c
#include "example.h"
double Example::rate = 6.5;
vector<double> Example::vec(vecSize);
最后
以上就是靓丽麦片为你收集整理的C++ Primer(第五版) 7.4--7.6节练习的全部内容,希望文章能够帮你解决C++ Primer(第五版) 7.4--7.6节练习所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复