练习13.18
定义一个Employee类,它包含雇员的姓名和唯一的雇员证号。为这个类定义默认构造函数,以接受一个标识雇员姓名的string的构造函数。每个构造函数应该通过递增一个static数据成员来生成一个唯一的证号。
解答:
class Employee{
public:
Employee();
Employee(const string &);
static int ID;
string name_;
};
int Employee::ID = 0;
Employee::Employee(){
++ID;
name_ = "internship";
}
Employee::Employee(const string &name){
++ID;
name_ = name;
}
大概就是这样吧。
练习13.19
你的Employee类需要定义它自己的拷贝控制成员吗?如果需要,为什么?如果不需要,为什么?实现你认为Employee需要的拷贝控制成员。
解答:
就依我上面的类实现来说,是不需要的。
因为,编译器会自动给我们生成一个。
这里,需要参考一下450页中,“合成的拷贝控制成员可能是删除的”章节的内容,确定一下自己定义的类中的拷贝控制成员是否会被删除。
练习13.20
解释当我们拷贝、赋值或销毁TextQuery和QueryResult类(参见12.3节,430页)对象时会发生什么。
解答:
这里也是在考察合成拷贝控制成员的概念,注意一下书中的note就可以了:
本质上,当不可能拷贝、赋值或销毁类的成员时,类的合成拷贝控制成员就被定义为删除的。
练习13.21
你认为TextQuery和QueryResult类需要定义他们自己版本的拷贝控制成员吗?如果需要,为什么?如果不需要,为什么?实现你认为这两个类需要的拷贝控制操作。
解答:
在我看来这两个类也是没有必要去定义其拷贝控制成员的。
这两个类是配合使用对文本进行查询的,在程序设计的角度,拷贝操作没有必要。
对于不同的文本,或者不同的流只需要新创建类对象就可以了,无需复制操作。
练习13.22
假定我们希望HasPtr的行为想一个值。即,对于对象所指向的string成员,每个对象都有一份自己的拷贝。我们将在下一节介绍拷贝控制成员的定义。但是,你已经学习了定义这些成员所需要的所有知识。在继续学习下一章之前,为HasPtr编写拷贝构造函数和拷贝赋值运算符。
解答:
完全可以参考453页下面的定义。
这里需要注意的就是拷贝运算符的定义,需要将指针指向一个新地址,并且将原有的内存进行释放,以免造成内存泄露。