득이공간

[Effective C++] 2장. 생성자, 소멸자 및 대입 연산자 본문

PS/C++

[Effective C++] 2장. 생성자, 소멸자 및 대입 연산자

쟁득 2024. 11. 2. 14:44
해당 게시물은 프로텍 미디어의 '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