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. 객체의 모든 부분을 모조리 복사하자.
- 객체 복사 함수는 주어진 객체의 모든 데이터 및 부모 클래스 부분도 빠뜨리지 않고 복사해서 한다.
- 클래스의 복사 함수 두개를 구현할 때 한쪽을 이용해서 다른 쪽을 구현하려는 시도는 하지말자.
'Basic Programming > C, C++' 카테고리의 다른 글
C++ - Effectvice C++의 55가지 테크닉 Part - 3 (0) | 2016.03.04 |
---|---|
C++ - Effectvice C++의 55가지 테크닉 Part - 2 (0) | 2016.03.03 |
C++ - ++i 와 i++의 차이 (0) | 2016.03.03 |
C++ - #pragma (0) | 2016.03.03 |
C++ - 멤버 이니셜라이져(Member Initializer) (0) | 2016.03.03 |