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처럼 어떤 형태의 쓸데없는 메모리 할당도 저지르지 않는다
상당히 많은 코드에서 이렇게 사용하고 있음(템플릿 메타프로그래밍의 핵심기법)
'Programming > C++' 카테고리의 다른 글
[cpp][effective_c++_18] 인터페이스 설계는 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 (0) | 2022.11.23 |
---|---|
[Cpp] Lambda 표현식에 대하여 알아보자 (1) | 2022.09.08 |
[CPP] c++ 용어 정리 (0) | 2022.01.24 |
[cpp] cpp11 new/delete 연산자 (0) | 2021.02.23 |
OOP 개념 (0) | 2019.01.01 |