득이공간
[Effective C++] 2장. 생성자, 소멸자 및 대입 연산자 본문
해당 게시물은 프로텍 미디어의 'Effective C++'를 보고
학습한 내용을 개인적으로 요약한 글입니다.
📌 목차 - 2장. 생성자, 소멸자 및 대입 연산자
2-1. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자
2-2. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자
2-3. 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자
2-4. 예외가 소멸자를 떠나지 못하도록 붙들어 놓자
2-5. 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자
2-6. 대입 연산자는 *this의 참조자를 반환하게 하자
2-7. operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자
2-8. 객체의 모든 부분을 빠짐없이 복사하자
📌 2-1. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자
- 컴파일러는 경우에 따라 클래스에 대해 기본 생성자, 복사 생성자, 복사 대입 연산자, 소멸자를 암시적으로 만들어 놓을 수 있다.
📌 2-2. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자
- 컴파일러에서 자동으로 제공하는 기능을 허용치 않으려면, 대응되는 멤버 함수를 private로 선언한 후에 구현은 하지 않은 채로 두자. Uncopyable과 비슷한 기본 클래스를 쓰는 것도 한 방법이다.
📌 2-3. 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자
- 다형성을 가진 기본 클래스에는 반드시 가상 소멸자를 선언해야 한다. 즉, 어떤 클래스가 가상 함수를 하나라도 갖고 있으면, 이 클래스의 소멸자도 가상 소멸자이어야 한다.
- 기본 클래스로 설계되지 않았거나 다형성을 갖도록 설계되지 않은 클래스에는 가상 소멸자를 선언하지 말아야 한다.
📌 2-4. 예외가 소멸자를 떠나지 못하도록 붙들어 놓자
- 소멸자에서는 예외가 빠져나가면 안 된다. 만약 소멸자 안에서 호출된 함수가 예외를 던질 가능성이 있다면, 어떤 예외이든지 소멸자에서 모두 받아낸 후에 삼켜 버리든지 프로그램을 끝내든지 해야 한다.
- 어떤 클래스의 연산이 진행되다가 던진 예외에 대해 사용자가 반응해야 할 필요가 있다면, 해당 연산을 제공하는 함수는 반드시 보통의 함수(즉, 소멸자가 아닌 함수)이어야 한다.
📌 2-5. 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자
- 생성자 혹은 소멸자 안에서 가상 함수를 호출하지 마라. 가상 함수라고 해도, 지금 실행 중인 생성자나 소멸자에 해당되는 클래스의 파생 클래스 쪽으로는 내려가지 않기 때문이다.
📌 2-6. 대입 연산자는 *this의 참조자를 반환하게 하자
- 대입 연산자는 *this의 참조자를 반환하도록 만들자.
📌 2-7. operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자
- operator=을 구현할 때, 어떤 객체가 그 자신에 대입되는 경우를 제대로 처리하도록 만들자. 원본 객체와 복사대상 객체의 주소를 비교해도 되고, 문장의 순서를 적절히 조정할 수도 있으며, 복사 후 맞바꾸기 기법을 써도 된다.
- 두 개 이상의 객체에 대해 동작하는 함수가 있다면, 이 함수에 넘겨지는 객체들이 사실 같은 객체인 경우에 정확하게 동작하는지 확인해 보자.
📌 2-8. 객체의 모든 부분을 빠짐없이 복사하자
- 객체 복사 함수는 주어진 객체의 모든 데이터 멤버 및 모든 기본 클래스 부분을 빠뜨리지 말고 복사해야 한다.
- 클래스의 복사 함수 두 개를 구현할 때, 한쪽을 이용해서 다른 쪽을 구현하려는 시도는 절대로 하지 말자. 그 대신, 공통된 동작을 제3의 함수에다 분리해 놓고 양쪽에서 이것을 호출하게 만들어서 해결하자.
'PS > C++' 카테고리의 다른 글
[Effective C++] 1장. C++에 왔으면 C++의 법을 따릅시다 (1) | 2024.10.21 |
---|---|
[C++ 문법 정리] 2. C++ 기본 (0) | 2024.02.03 |
[C++ 문법 정리] 1. C++ 기초 (0) | 2024.02.03 |