【发布时间】:2013-07-08 05:00:27
【问题描述】:
在 C++ 中,当类包含动态分配的数据时,显式定义复制构造函数、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();
}
};
这是否正确? 以这种方式拆分代码是一个好习惯吗?
【问题讨论】:
-
+1 因为这个问题有助于提高我的认识。在阅读答案之前,它看起来像是我会写的。
-
嗯,我很少在两者中重复代码,因为它们都做完全不同的事情:一个初始化,一个分配......
-
其课程设计的“深拷贝”性质导致重复。
-
@PlasmaHH 这取决于。考虑一个简单的字符串或向量类,使用深拷贝语义。 (重复代码的数量是否足以证明额外的功能是另一个问题。如果它只是一个简单的
new,那么单独的功能可能不值得费心。) -
This is what I would have done
assign、clear和swap完成所有工作。
标签: c++ destructor copy-constructor assignment-operator code-sharing