본문 바로가기
반응형

C++14

Effective C++ 항목11 : operator에서는 자기대입에 대한 처리가 빠지지 않도록 하자 Effective C++ 항목11 operator에서는 자기대입에 대한 처리가 빠지지 않도록 하자 선 요약 operator=함수를 구현할 때, 자기대입을 제대로 처리하도록 하자. 객체간의 주소 비교 호출 순서를 적절히 조절 "복사 후 맞바꾸기" 기법 두 개 이상의 객체에 대해 동작하는 함수가 있다면, 이 함수에 넘겨지는 객체들이 사실 같은 객체인지 정확하게 체크하자. class Widget{ ... } Widget w; ... w = w // 자기에 대한 대입 위와 같이 C++에서는 자기 자신을 대입하는 자기대입이 적법(legal)하다. 자기대입은 여러 곳에서 하나의 객체를 참조하는 상태, 즉 중복참조라고도 불린다. 중복참조란? class Base { ... } class Derived { ... } v.. 2023. 2. 18.
Effective C++ 항목10: 대입 연산자는 *this의 참조자를 반환하게 하자 Effective C++ 항목10 대입 연산자는 *this의 참조자를 반환하게 하자 C++의 대입 연산자는 여러 개가 사슬처럼 엮일 수 있다. int x, y, z; x = y = z = 15; // 위 식은 아래와 같이 처리됨 x = (y = (z = 15))); 위와 같은 관례를 지키는 것이 편한 길. 따라서 각종 객체의 대입 연산자는 좌변 인자에 대한 참조자를 반환해야함 연산자 =, +=, -=의 경우 아래와 같은 꼴로 반환 처리 class Widget { public: Widget& operator=(const Widget& rhs) // =연산자 { ... return *this; } Widget& operator+=(const Widget& rhs) // +=연산자 { ... return *t.. 2023. 2. 13.
Effective C++ 항목9 : 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자 Effective C++ 항목9 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자 객체 생성 및 소멸 과정 중에는 절.대.로 가상 함수를 호출해선 안된다!! // 기본 클래스 class Transaction { public: Transaction(); virtual void logTransaction() const = 0; // 타입에 따라 달라지는 로그 기록 ... }; // 기본 클래스 생성자 Transaction::Transaction() { logTransaction(); } // Transaction 의 파생 클래스 class BuyTransaction : public Transaction { public: // Transaction 타입에 따른 거래내역 로깅 virtual vo.. 2023. 2. 12.
Effective C++ 항목8 : 예외가 소멸자를 떠나지 못하도록 붙들어 놓자 Effective C++ 항목8 예외가 소멸자를 떠나지 못하도록 붙들어 놓자 클래스의 인스턴트, 즉 객체가 소멸할 때 각종 예외를 처리할 수 있다. class DBConnection { public: ... static DBConnection create(); void close(); }; class DBConn // DBConnection 객체를 관리하는 클래스 { public: ... ~DBConn() { db.close(); } // 데이터베이스 연결이 항상 닫히도록 // 확실히 챙겨주는 함수 private: DBConnection db; }; 소멸자의 db.close()에서 예외가 발생할 수 있음. 대응책은? 1) 프로그램을 바로 끝내버림. abort()호출 DBConn::~DBConn() { t.. 2023. 2. 6.
반응형