1. CPP를 언어들의 연합체로 바라보는 안목이 필요하다

CPP의 구성요소

1.C

2.객체 지향 개념의 C++

3.템플릿 C++

4.STL

 

2. #define을 쓰려거든 const, enum, inline을 떠올리자

즉 선행처리자보다 컴파일러를 더 가까이하자 !

#define BREAD_NUMBER 4 

라고 정의햇을 경우 컴파일러는 BREAD_NUMBER라는 기호를 모른다( 컴파일러에게 넘어가기전에 선행처리자가 밀어버리고 상수로 바꾸기 때문)

고로 에러메시지에 BREAD_NUMBER보다는, 4로 나오는 상황이다(0이나 1이라면 에러났을때 곤란해,, )

이 숫자를 찾아들어가기 힘들기 때문에 이렇게 #define으로 선언하는것보다 상수를 쓰는것이 바람직하다.

const int BreadNumber=4;

 

단, 이렇게 #define을 상수로 교체할 때에는 조심해야할 점이 두가지 있다.

1. 상수 포인터를 정의하는경우 

상수정의는 대개 헤더파일에 넣는게 국룰..! 포인터는 꼭 const로 선언해주어야하고, 아울러 포인터가 가리키는 대상까지 const로 선언해야한다.

이를 테면 어떤 헤더파일안에 char*기반의 상수를 정의한다면 const를 두 번 써줘야한다;

const char* const name="Mike"; 

사실 이 경우 string을 쓰는게 깔끔하다

const std:string name("Mike");

 

2. 클래스 멤버로 상수를 정의하는 경우, 즉 클래스 상수를 정의하는경우

어떤 상수의 유효범위를 클래스로 한정하고자 할 때는 상수를 멤버로 만들어야하는데, 그 상수의 사본개수가 한 개를 넘기지 못하게 하고싶다면 static멤버로 만들어야한다.

Class GamePlayer{
private:
static const int NumTurns=3; //상수 선언
int scores[NumTurns]; //상수 사용하는 부분
}

위 상수는 선언된 것 (정의 된 것이 아님)

정적 멤버로 만들어지는 정수류는 정의 안해도됨

꼭 정의가 필요하다면 이렇게 쓰면 됨

const int GamePlayer::NumTurns;

초기값은 선언/정의 아무때나 넣어줘도 됨

 

Tip ) 나열자 둔갑술(enum hack)

위 클래스에서 static const int NumTurns=3 ; 대신 아래와 같이 쓸 수 있다.

enum{ NumTurns = 3};

나열자 둔갑술은 동작방식이 #definde에 가깝다.

->선언한 정수 상수를 가지고 다른사람이 주소를 얻는다던지, 참조자를 쓴다던지 하는것이 싫다면 자물쇠가 될 수 있다.

enum은 #define처럼 어떤 형태의 쓸데없는 메모리 할당도 저지르지 않는다

상당히 많은 코드에서 이렇게 사용하고 있음(템플릿 메타프로그래밍의 핵심기법)

 

복사했습니다!