在 C++ 中,当类包含动态分配的数据时,显式定义复制构造函数、operator= 和析构函数通常是合理的。但是这些特殊方法的活动是重叠的。更具体地说, operator= 通常首先进行一些破坏,然后进行类似于复制构造函数中的处理。
我的问题是如何在不重复相同代码行且不需要处理器做不必要的工作(如不必要的复制)的情况下以最佳方式编写此代码。
我通常会得到两种帮助方法。一种用于建设,一种用于破坏。第一个是从复制构造函数和 operator= 调用的。第二个由析构函数和 operator= 使用。
这是示例代码:
template <class T>
class MyClass
{
private:
// Data members
int count;
T* data; // Some of them are dynamicly allocated
void construct(const MyClass& myClass)
{
// Code which does deep copy
this->count = myClass.count;
data = new T[count];
try
{
for (int i = 0; i < count; i++)
data[i] = myClass.data[i];
}
catch (...)
{
delete[] data;
throw;
}
}
void destruct()
{
// Dealocate all dynamicly allocated data members
delete[] data;
}
public: MyClass(int count) : count(count)
{
data = new T[count];
}
MyClass(const MyClass& myClass)
{
construct(myClass);
}
MyClass& operator = (const MyClass& myClass)
{
if (this != &myClass)
{
destruct();
construct(myClass);
}
return *this;
}
~MyClass()
{
destruct();
}
};
这甚至正确吗?以这种方式拆分代码是一个好习惯吗?