13.1? 拷贝构造函数是什么?什么时候使用它?
? 符合 “ 第一个参数是自身类类型的引用,且任何额外参数都有默认值 ” 的 构造函数 是拷贝构造函数。
当:
? 1.将一个对象作为实参传递给一个非引用类型的形参 (调用实参作为非&参数)
? 2.从一个返回类型为非引用类型的函数返回一个对象 (f(x)返回非&类型)
? 3.用花括号列表初始化一个数组中的元素或者一个聚合类中的成员 (列表初始化一个array或者聚合类成员)
13.2? 解释为什么下面的声明是非法的:
Sales_data::Sales_data(Sales_data rhs);
? 拷贝构造函数的第一个参数应该是自身类类型的引用,如果不是,则调用永远不可能成功——为了调用拷贝构造函数,我们必须拷贝它的实参,但为了拷贝实参,我们又需要调用拷贝构造函数,如此无限循环。
13.3? 当我们拷贝一个StrBlob时,会发生什么?拷贝一个StrBlobPtr呢?
? StrBlob中元素复制,且智能指针计数加一。StrBlobStr中元素复制,弱指针复制不影响计数器
13.4? 假定Point是一个类类型,他有一个Public的拷贝构造函数,指出下面程序片段中哪些地方使用了拷贝构造函数:
Point global;
Point foo_bar(Point arg)
{
Point local = arg,*heap = new Point(global);
*heap = local;
Point pa[4] = (local,*heap);
return *heap;
}
foo_bar 的参数不是引用类型,需拷贝;使用拷贝构造函数,函数返回类型非引用,需拷贝;将arg拷贝到local、将global拷贝到heap,将local和*heap拷贝pa[4],需拷贝;local拷贝到*heap属于拷贝赋值运算符。
13.5? 给定下面的类框架,编写一个拷贝构造函数,拷贝所有成员。你的构造函数应该动态分配一个新的string(参见12.1.2节,第407页),并将对象拷贝到ps指向的位置,而不是拷贝ps本身:
class HasPtr{
public:
HasPtr(const std::string &s = std::string()):
ps(new std::string(s)),i(0) {}
private:
std::string:: *ps;
int i;
}
HasPtr(const Hasptr& HP):*ps(new string *HP.ps),i(HP.i){}
|