책: Effective C++
주제: C에서 C++로의 전환
항목: #define보다는 const와 inline을 사용한다.
전처리기(preprocessor)보다는 컴파일러를 선호하는 경향을 가져야 한다.
#define ASPECT_RATIO 1.653
위의 코드는 전처리기에서 처리하기 때문에 실제 컴파일러는 ASPECT_RATIO를 전혀 알 수 없다. 따라서, 컴파일 시 에러가 발생했을 경우
에러 메세지에 ASPECT_RATIO나 1.653에 대한 언급이 전혀 없기 때문에 혼란을 야기할 수 있다.
따라서, 다음과 같이 상수로 정의하는 것이 좋다.
const double ASPECT_RATIO = 1.653;
상수(const variable)로 정의함으로써 얻어지는 이점은 다음과 같다.
1. 상수 포인터를 정의하기가 까다롭다.
예) const char * 기반의 스트링 정의 시 const를 두 번 사용해야 한다.
cost char * const authorName = "Scott Meyers";
2. 클래스 범위에서의 상수 정의
상수의 영역을 클래스로 제한하기 위해서는 단 한 개의 복사본이 있따는 것을 확신하기 위해
정적(static) 멤버로 만들어야 한다.
class GamePlayer {
private:
static const int NUM_TURNS = 5; // 상수 선언
int scores[NUM_TURNS]; // 상수의 사용
...
};
단, 위에서 보는 코드는 선언(declaration)이지 정의(definition)가 아니다.
즉, 구현 파일에 정적 클래스 멤버를 정의해야 한다.
const int GamePlayer::NUM_TURNS; // 필수적인 정의
만약 위와 같이 안 된다면, 다음과 같이 작성한다.
// in header file;
class EngineeringConstants {
private:
static const double FUDGE_FACTOR;
...
};
// in class implementation file;
const double EngineeringConstants::FUDGE_FACTOR = 1.35;
클래스 내 정수형 클래스 상수에 대해 초기값 지정을 금지하는 컴파일러를 보완하기 위한 일반적인 방법은
enum을 이용하는 것이다.
class GamePlayer {
private:
enum { NUM_TURNS = 5 }; // "the enum hack" - makes
int scores[NUM_TURNS]; // this is fine
};
Posted by 하솔