我理解需要深层复制,并确保我的代码按照需要运行,我正在为我的班级编写复制ctor,赋值运算符和dtor。
然而,在我看来,在每种情况下,赋值运算符必须首先执行析构函数的操作(释放任何动态分配的内存,以防止内存泄漏),然后复制构造函数执行的操作(制作深层副本)所有动态分配的数据并将其复制到正在构造的实例中。
是否存在赋值运算符在概念上应执行除以下操作之外的其他操作的情况?
class SomeClass{
//member data, copy ctor, dtor
SomeClass& operator=(SomeClass const& rhs){
//what the destructor does
//what the copy constructor does
}
};
代码几乎相同,似乎浪费时间重写。除了直接在赋值运算符的开头调用析构函数之外,我无法想到重用我已经编写过的复制构造函数代码的方法,因为我相信做了类似的事情
*this=rhs
只会递归地调用赋值运算符,因为从技术上说,“this”已经被构造。
答案 0 :(得分:1)
正如评论中所述,您应用copy-and-swap idiom来解决您对代码重复的担忧:
class SomeClass{
//member data, copy ctor, dtor
SomeClass& operator=(SomeClass rhs){
swap(*this, rhs);
return *this;
}
friend void swap(SomeClass& first, SomeClass& second) {
using std::swap;
swap(first.data, second.data);
//... etc. for other data members
}
};
您必须实现额外的swap
函数,但您的复制构造函数和析构函数代码以自然的方式重用。当赋值的源传递给赋值运算符时使用复制构造函数,并且当赋值运算符返回时,当参数被破坏时,将重用析构函数。