변수 선언하면서 초기화할 때 이외에도 복사 생성자가 실행되는 경우
- 값에 의한 호출로 매개변수를 전달할 때
- 함수가 값에 의한 반환을 할 때
- 배열 혹은 벡터의 원소들을 중괄호로 초기화할 때
치환문에서 Deep copy 원한다면 = 오버로딩
Bar& operator=(const Bar& t) {
clearMembers();
ptr = new Foo(*t.ptr);
for (auto& pt : t.vec)
vec.push_back(new Foo(*pt));
return *this;
}
자신과 동일한 타입의 객체를 받으려면 const로 받아야 합니다. 이는 규칙으로 이해해주시면 됩니다.
private:
void clearMembers() {
delete ptr;
for (auto p : vec)
delete p;
vec.clear();
}
Destructor
객체가 삭제될 때 garbage가 생성되지 않도록 하는 기능이 Destructor입니다.
- 객체의 scope 밖으로 빠져 나갈 때, 예를 들어 자신이 선언된 함수가 return 될 때
- delete 명령으로 동적 객체가 삭제될 때
Destructor는 클래스의 이름과 동일한 이름을 가지며 앞에 ~를 붙입니다.
class Foo {
public:
~Foo() {}
};
Destructor를 만들지 않으면 컴파일러가 자동으로 디폴트 디스트럭터를 만들어줍니다.
따라서 모든 클래스는 어쩄든 하나의 destructor를 가집니다. 디폴트 디스트럭터는 primitive type 멤버는 직접 삭제하고, 클래스 타입 멤버는 그 클래스의 디스트럭터를 호출하여 삭제합니다.
일반적으로 포인터를 멤버로 가지고 있지 않은 경우 디폴트 디스트럭터로 충분합니다.
Destructor의 필요성
class Foo {
public:
int val;
Foo() = default;
Foo(int a) : val(a) {}
};
class Bar {
public:
Foo* ptr;
vector<Foo*> vec;
Bar() = default;
Bar(Foo* p, vector<Foo*> v) : ptr(p), vec(v) {}
Bar(const Bar& t) {}
Bar& operator=(const Bar& t) {}
void clearMembers() {}
};
void func() {
Foo* f = new Foo(100);
vector<Foo*> v{ new Foo(1), new Foo(2), new Foo(3) };
Bar a(f, v);
}
'IT 프로그래밍 > 객체지향프로그래밍' 카테고리의 다른 글
상속이란? (0) | 2024.06.19 |
---|---|
컴파일 과정 (0) | 2024.06.18 |
객체의 복사와 삭제 (0) | 2024.06.17 |
다항식 계산기 (code12. cpp 수정 (0) | 2024.06.16 |
동적 생성 개체의 삭제와 쓰레기 (0) | 2024.06.16 |