~클래스명() 형태 class Student {
char* name; // 동적 할당
public:
Student() {name = new char[5]; strcpy(name, "KIM");}
~Student() { delete[] name; } // 메모리 누수 방지
};
단순히 상속된 객체의 메모리를 정리
직접 소멸자를 정의하지 않아도 되기에 편함
그러나, 동적 메모리, 파일 핸들, 네트워크 등 외부 자원을 직접 해제하지 않음
이런 경우 직접 소멸자를 정의하여 사용
ClassName(const ClassName& other);class T {
privae:
int id;
public:
T(const T& x) { // 복사 생성자
id = x.id; // &로 private인 id 변수에 접근 가능
}
};
const를 사용하여 인자로 받은 객체를 수정하지 않게 함&을 통해 인자로 받은 객체에 쉽게 접근 Book b1("C++", 300); // 생성자 호출
Book b2 = b1; // 복사 생성자 호출
Book b3(b2); // 복사 생성자 호출. 둘 다 같은 방식이다
void func(Book b);
func(b1); // 복사 생성자 호출하여 b에 b1이 복사됨
Book func() { Book b; return b; }
Book b2 = func(); // 반환값 복사
복사 생성자를 정의하지 않으면, 컴파일러가 자동으로 "디폴트 복사 생성자" 생성
디폴트 복사 생성자는 모든 멤버를 1:1로 얕은 복사함
얕은 복사(Shallow Copy)
깊은 복사(Deep Copy)
