C++에서 클래스에 동적으로 할당 된 데이터가 포함되어 있으면 일반적으로 복사 생성자 인 operator = 및 destructor를 명시 적으로 정의하는 것이 타당합니다. 그러나 이러한 특별한 방법의 활동은 겹칩니다. 좀 더 구체적으로 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 내 질문에 도움이 되었기 때문에 +1. 나는 답을 읽기 전에 내가 썼을 무언가처럼 보입니다. – ToolmakerSteve
흠, 둘 다 코드가 중복되는 경우는 거의 없습니다. 둘 다 완전히 다른 것들이 있습니다. 하나는 초기화하고, 하나는 .... – PlasmaHH
은 복제로 이어지는 그의 클래스 디자인의 "딥 카피"특성을 지정합니다. – ToolmakerSteve