소멸자에서는 예외가 빠져나가면 안 된다. 만약 소멸자 안에서 호출된 함수가 예외를 던질 가능성이 있다면, 어떤 예외이든지 소멸자에서 모두 처리해야 한다. 어떤 클래스의 연산이 진행되다가 던진 예외에 대해 사용자가 반응해야 할 필요가 있다면, 해당 연산을 제공하는 함수는 반드시 소멸자가 아니어야 한다. 예외가 소멸자를 떠나지 않게 하자 소멸자로부터 예외가 터져 나가는 경우를 C++ 언어에서 막는 것은 아니지만, 실제 상황을 보면 확실히 막아야 하긴 하다. class Widget { public: ... ~Widget () { ... } // 이 함수에서 예외가 발생한다고 가정 }; void doSomething() { std::vector v; ... } // v 자동 소멸 vector 타입의 객체 v는 ..
소멸자
생성자 혹은 소멸자 안에서 가상 함수를 호출하지 마라. 가상 함수라고 해도, 지금 실행 중인 생성자나 소멸자에 해당되는 클래스의 파생 클래스 쪽으로 내려가지 않는다. 객체 생성 및 소멸 중 가상 함수 금지 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하면 안된다. class Transaction { // 기본 클래스 public: Transaction(); virtual void logTransaction() const = 0; // 순수 가상함수(로깅) ... }; Transaction::Transaction() // 기본 클래스 생성자 { ... logTransaction(); } class BuyTransaction: public Transaction { // Transaction의 파생..
다형성을 가진 기본 클래스에는 반드시 가상 소멸자를 선언해야 한다. 어떤 클래스가 가상 함수를 하나라도 갖고 있으면 이 클래스의 소멸자도 가상 소멸자이어야 한다. 기본 클래스로 설계되지 않았거나 다형성을 갖도록 설계되지 않은 클래스에는 가상 소멸자를 선언하지 말아야 한다. 다형성과 가상 소멸자 다형성을 갖는 클래스를 사용하는 상황을 가정해 보자. 시간 기록을 유지하는 클래스를 제작할 것인데 기본 클래스를 만들고 용도에 따라 파생시키는 구조를 설계한 상황이다. class TimeKeeper { public: TimeKeeper(); ~TimeKeeper(); ... }; class AtomicClocK: public TimeKeeper { ... }; class WaterClocK: public TimeK..
컴파일러는 경우에 따라 클래스에 대해 기본 생성자, 복사 생성자, 복사 대입 연산자, 소멸자를 암시적으로 만들 수 있다. C++이 자동 생성하는 함수들 C++ 클래스는 생성자와 소멸자, 대입 연산자를 포함한다. 생성자는 새로운 객체를 메모리에 만드는데 필요한 과정을 제어하고 객체의 초기화를 진행한다. 소멸자는 객체를 없앰과 동시에 그 객체가 메모리에서 적절히 사라질 수 있도록 하는 과정을 제어한다. 대입 연산자는 기존의 객체에 다른 객체의 값을 줄 때 사용하는 함수이다. 이러한 것들은 유용하면서도 위험할 수 있는 함수들이다. C++이 스스로 만드는 함수 C++은 복사 생성자, 복사 대입 연산자, 소멸자를 직접 선언하지 않으면 스스로 생성한다. 이들은 모두 public 멤버이며 inline함수이다. cla..