August 2021
Intermediate to advanced
450 pages
5h 35m
Chinese
当一个类作为资源句柄(resource handle)时,换句话说,当这个类对一个通过指针访问的对象负责时,默认的逐成员拷贝通常意味着灾难。逐成员拷贝会违反资源句柄的不变式(参见3.5.2节)。例如,下面所示的默认拷贝将产生一个与原对象指向相同元素的Vector副本:
假设v1包含四个元素,则结果如下图所示。
幸运的是,Vector具有析构函数这一事实强烈暗示默认的(逐成员)拷贝语义是错误的,编译器应该至少对此给出警告。我们应该为其定义更好的拷贝语义。
类对象的拷贝通过两个成员来定义:拷贝构造函数(copy constructor)与拷贝赋值运算符(copy assignment):
对Vector来说,拷贝构造函数的正确定义应该首先为指定数量的元素分配空间,然后把元素拷贝到其中,这样在拷贝完成后,每个Vector就拥有自己的元素副本了:
现在v2=v1的结果可图示如下。
当然,在拷贝构造函数之外我们还需要一个拷贝赋值运算符:
其中,名字this在成员函数中是预定义的,它指向调用该成员函数的那个对象。 ...
Read now
Unlock full access