728x90

Effective C++의 내용 정리입니다. 

 

1. C++을 언어들의 연합체로 생각하자.

   - C++이 C에 가깝다는 생각은 예전 생각이고 이제는 경우에 따라 프로그래머 규칙을 새로이 생각함으로써 바꿀 필요가 있는데 

     그 경우란 C++의 어떤 부분을 사용하느냐에 따라 달려 있다.

     C++은 크게 4가지로 나뉘는데 종류는 다음과 같다.

     1) C : C++은 당연히 C를 기본으로 작성되어 있다.

     2) 객체지향개념의 C++ : 클래스를 사용하는 C에 관한 모든 것.

     3) Template C++ : C++의 일반화 프로그래밍 부분.

     4) STL : 컨테이너, 반복자, 알고리즘 펑터로 이루어진 템플릿 라이브러리.

 

2. #define을 쓰려거든 const, enum, inline을 먼저 생각하자.

   - 단순 상수일 경우일때는 #define보다 const 객체나 enum을 사용하자.

   - 함수처럼 쓰이는 매크로를 만들 경우 #define보다는 template inline함수를 사용하자.

 

3. 가능하면 const를 사용한다.

   - const를 붙여 사용시 컴파일러가 사용상의 에러를 잡아내는데 도움을 준다.

     어떤 유효범위에 있는 객체에도 붙어 있을 수 있다.

   - 상수 멤버나 비상수 멤버함수가 기능적으로 서로 같게 구현되어 있을 경우에 코드 중복이 일어날

      수 있다. 이럴땐 비상수 버전이 상수버전을 호출하도록 사용하자. (mutable 키워드)

 

4. 객체 사용 이전엔 반드시 그 객체를 초기화 하자.

   - 기본제공 타입의 객체(int, float)는 직접 손으로 초기화 하자.

   - 생성자에서 멤버이니셜라이저를 사용하자. (const상수 멤버 및 변수는 물론 생성자 이전에 호출함으로 상당히 유용하다.)

   - 여러 번역 단위에 있는 비지역 정적객체들의 초기화 순서 문제를 피해서 클래스 설계를 하자. (Singleton Pattern)

 

5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에게 신경을 쓰자.

   - 컴파일러는 경우에 따라 클래스에 대해 기본 생성자, 복사 생성자, 복사 대입연산자, 소멸자를 암시적으로 생성한다.

 

6. 컴파일러가 만들어낸 함수가 필요없으면 이들의 사용을 확실히 없애버리자.

   - 컴파일러에서 자동으로 제공하는 기능을 허용하지 않으면, 대응되는 멤버함수를 private으로 선언한 후에 구현은 하지 않은 채

     로 두자. 기본 클래스를 사용하는 것도 한 방법이다.

 

7. 다형성을 가진 기본 클래스는 반드시 가상소멸자를 사용한다.

   - 상속을 하는 기본 클래스일 경우 가상 소멸자를 사용하자.

   - 기본 클래스로 설계되지 않았거나 다형성을 갖도록 설계되지 않은 클래스에는 가상소멸자는 선언하지 말자.

 

8. 예외가 소멸자를 떠나지 못하도록 붙들어 놓자.

   - 소멸자에서는 예외가 빠져나가지 않도록 하되, 가능성이 있다면 소멸자에서 받아 삼키거나 프로그램을 종료하자.

   - 어떤 예외에 대해 사용자가 반응해야 할 필요가 있다면 해당 연산을 제공하는 함수는 소멸자가 아닌 함수여야 한다.

 

9 . 객체 생성 및 소멸 과정중에 절대 가상 함수를 호출하지 말자.

   - 생성자 혹은 소멸자안에서는 가상함수를 호출하지 말자.

 

10. 대입 연산자는 *this의 참조자를 반환하게 하자.

   - T& operator=(const T& rhs)

     {

          ......

          return *this;

     }

 

11. operator=에서는 자기 대입에 대한 처리가 빠지지 않도록 하자.

   - 원본 객체와 복사대상 객체의 주소를 비교해도 되고, 문장의 순서를 적절히 조정해도 되고 copy and swap 을 사용해도 된다.

   - 두개 이상의 객체에 대해 동작하는 함수가 있다면, 이 함수에 넘겨지는 객체들이 사실 같은 객체인경우에 정확하게 동작하는지 

     확인하자.

 

12. 객체의 모든 부분을 모조리 복사하자.

   - 객체 복사 함수는 주어진 객체의 모든 데이터 및 부모 클래스 부분도 빠뜨리지 않고 복사해서 한다.

   - 클래스의 복사 함수 두개를 구현할 때 한쪽을 이용해서 다른 쪽을 구현하려는 시도는 하지말자.

 

출처 : http://blog.naver.com/sorkelf/40146367692

728x90

+ Recent posts