IT 프로그래밍/객체지향프로그래밍

복사생성자

기술1 2024. 6. 17. 16:31

변수 선언하면서 초기화할 때 이외에도 복사 생성자가 실행되는 경우

  • 값에 의한 호출로 매개변수를 전달할 때
  • 함수가 값에 의한 반환을 할 때
  • 배열 혹은 벡터의 원소들을 중괄호로 초기화할 때

치환문에서 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