Bitwise Copy Semantics (位逐次拷贝)
#include "Word.h"
Word noun("book");
void foo()
{
Word verb = noun;
...
}
如果Word没有定义explicit copy constructor,那么是否会有一个编译器合成的实例被调用?这的看该Word是否展现“bitwise copy semantics”而定。
// 以下声明展现了bitwise copy semantics
class Word {
public:
Word(const char*);
~Word(){ delete [] str;}
//...
private:
int cnt;
char* str;
}
这种情况下并不需要合成出一个default copy constructor,因为上述声明展现了“default copy semantics”,而verb的初始化操作也就不需要以一个函数调用收场。但是local object verb和global object noun都指向相同的字符串。在退出foo()之前,local object verb会执行destructor,于是字符串被删除,global object noun从此指向一堆无意义之物。member str的问题只能够靠“由class设计者实现出一个explicit copy constructor 以改写default memberwise initialization”或靠“不允许完全拷贝”来解决。
// 以下声明并未展现bitwise copy semantics
class Word {
public:
Word(const String&);
~Word();
//...
private:
int cnt;
String str; //string 声明了一个explicit copy constructor :Str

最低0.47元/天 解锁文章
1231

被折叠的 条评论
为什么被折叠?



