C++ では、クラスに動的に割り当てられたデータが含まれる場合、通常、コピー コンストラクター、operator=、およびデストラクターを明示的に定義するのが合理的です。しかし、これらの特別なメソッドの活動は重複しています。より具体的には、 operator= は通常、最初に何らかの破壊を行い、次にコピーコンストラクターと同様の対処を行います。
私の質問は、同じコード行を繰り返さずに、プロセッサが不要な作業 (不要なコピーなど) を実行する必要なく、これを最善の方法で記述する方法です。
私は通常、2つの支援方法に行き着きます。1 つは構築用、もう 1 つは破壊用です。1 つ目は、コピー コンストラクターと operator= の両方から呼び出されます。2 つ目は、デストラクタと 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();
}
};
これも正しいですか?そして、このようにコードを分割するのは良い習慣ですか?