C++Primer第五版 第七章习题答案(31~40)

31:知识点1:可以将类当作一种类型来看待,两个类即使成员部分完全相同,也属于不同的类型

知识点2:类允许包含指向它自身类型的指针或者引用

知识点3:创建一个类的对象之前必须先定义该类,仅仅声明是无法让编译器了解到该类需要多少空间的

#ifndef Cccc//第一次包含本头文件时,#ifndef判断为真,预处理器将处理后面的内容直到#endif,此时的预处理变量Cccc已定义
#define Cccc//第二次包含本头文件时,#ifndef判断为假,预处理器将忽略后面的内容

class X;//事先声明
class Y
{
	X object;
};

class X
{
	Y *my_pointer = NULL;
};

#endif//只要简单的加上就好了,无视C++中的作用域规则,作用是防止头文件被重复包含

32:知识点1:若想将一组重载函数声明为一个类的友元,那么必须逐个进行声明

知识点2:在类内声明的友元必须在类内或者类外进行定义之后才可以使用


此题在clear()函数之前加 friend 关键字即可


33:知识点1:一个类就是一个作用域,函数使用的相关变量名,已经明确了在类的作用域当中,所以不必再进行说明

知识点2:在类的外部定义的函数,必须声明类作用域,其函数名和返回类型都需要进行声明


此题的pos在类中声明定义,在外部使用时需要声明作用域

Screen::pos Screen::size() const


34:知识点1:名字查找的顺序:由内而外、自上而下

知识点2:类的定义处理步骤:首先编译成员的声明,直到类全部可见是再编译函数体

即成员函数在类的声明全部处理完之后才会被定义,所以可以调用函数中定义的任何名字

知识点3:在类中,类型名要特殊处理,最好是定义在类的一开始,并且不能与外层作用域中同名


此题中,会出现错误:pos未定义


35:Type有两种类型,应将最后一个函数的Type也声明为Exercise::作用域,因为返回值是double类型


36:知识点1:类内成员是const、引用时或者使用某种类类型没有默认构造函数的成员时必须将其初始化

知识点2:初始化和赋值是不等价的

知识点3:成员初始化的顺序一般是没有要求的,但是若用一个成员来初始化另一个成员是,就必须考虑到其定义时的顺序(写时保持顺序一直即可)



此题即出现了知识点3中的问题,用一个成员来初始化另一个成员,没有考虑顺序问题


37:知识点:当构造函数为所有参数都提供了默认实参时,实际上也定义了默认构造函数


第一个调用的是第三种构造函数

第二个调用的是默认的构造函数(默认参数已经在237页的代码中设定)

第三种调用的是第一种构造参数


38:

Sales_data(std::istream &is = std::cin) { read(is, *this); }//将默认实参直接赋予变量即可


39:不合法,调用的时候不知道调用哪个了,编译器分辨不了。


40:Employee:数据成员:company/name/age/address/salary/position/.......

构造函数中company可以设置为默认参数,其他的可以进列表初始化。



你可能感兴趣的:(【C++Primer习题】,C++Primer,第五版习题答案详解)