我是靠谱客的博主 靓丽麦片,最近开发中收集的这篇文章主要介绍C++ Primer(第五版) 7.4--7.6节练习,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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节练习所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部