티스토리 뷰
면접 대비용으로 작성한 것이라 나를 제외한 보는 사람에겐 두서 없어 보일 수 있음.
1. const 는 일단 절대 변경 되지 말아야 할 것을 지정해주는 것임. 우리가 코드를 작성할 때
const에 대한 변경을 시도한다면 컴파일러가 잡아낸다.
2. const 포인터
int* myScore;
myScore = new int[50];
myScore[3]=10;
위 코드가 있다고 가정해보자. myScore는 50칸 짜리 int형 배열을 가리키고 있다.
myScore가 가리키는 데이터가 변경이 되지 않게 하려면
위 코드에서 int* myScore --> const int* myScore 혹은 int const* myScore로 변경해주어야 한다.
이렇게 된다면 위 코드에서 myScore[3] =10 부분에서 컴파일이 되지 않는다
만약에 가리키는 데이터가 아닌 myScore 포인터 자체를 const형으로 하고 싶으면
int* const myScore = nullptr로 선언해주면 된다. 위의 코드 처럼 실행을 하고 싶으면 선언과 동시에 초기화를 시전해주면 된다
int* const myScore = new int[50];
myScore[3]= 10;
이렇게 해주면 된다.
가리키는 데이터와 myScore 포인터 둘 다 const 형으로 하고 싶으면
int const * const myScore = nullptr;
혹은
const int * const myScore = nullptr;
뒤지게 헷갈린다. c++의 최대 단점이라고 생각한다. 불필요하게 현학적이다....
전문가를 위한 c++에서 팁을 하나 주었다.
변수 선언이 헷갈릴 때에는 오른쪽에서 왼쪽으로 읽으라는 것.
가령 double* const ranking 이라는 것이 있다고 가정할 때,
ranking은 const *로써 double을 가리킨다! (고정 되어있는 가리키는 대상이 double을 가리키고 있구나)
라고 해석하라는 것이다.
또다른 예로 double const * ranking이라는 것이 있으면
아 ~ ranking은 포인터로 const int를 가리키는 거구나(= 가리키는 데이터가 픽스되어있구나)
3. 함수 파라미터에서 const 참조
함수 파라미터 선언할 때 const를 사용한다는 것은 함수 안에서 변경을 절대 하지 않겠다라는 의미
const 없이 & 참조만 한다면 함수 안에서 원본이랑 같이 변경한다는 이야기
4. 클래스 메서드 const
메서드를 const로 선언한다면 그 함수 안에서는 mutable로 선언된 변수를 제외하고 아무것도 변경할 수 없다.
그래서 코드들을 많이 살펴보면 get으로 무슨 데이터를 가져올때 주로 사용함.
5. constexpr 키워드 --> 상수 표현식 사용
배열선언할때처럼 상수값이 요구되는 곳에 constexpr 키워드를 사용해서 함수로 넣을 수 있다
ex)
const int getMonsterSize() { return 315;}
int arr[getMonsterSize()] --> 이런건 안된다는 의미
대신
constexpr int getMonsterSize() {return 315;}
int arr[getMonsterSize()] --> 이건 된다.
다만 함수를 contexpr로 선언해서 사용하려면 꽤 많은 제약사항들이 존재한다.
1. 함수의 본체는 단 하나의 리턴문만 있어야 됨
2. goto try/catch 블록이 포함되면 안됨. 익셉션을 발생시켜도 안돼.
3. 리턴 타입은 리터럴 타입이어야함(내장 타입 데이터, int , float , char[] 등등)
4. 모든 함수 인자는 리터럴 타입이어야 한다..
그밖에도 더 있는데 나는 안쓸거 같아서 생략한다.
'언어' 카테고리의 다른 글
C++ 초기화 (0) | 2019.06.06 |
---|---|
C++ 타입 그리고 캐스팅 방법 (0) | 2019.06.06 |
C++ 이동 시맨틱 (0) | 2019.06.06 |
C++ 참조 정리 (0) | 2019.06.06 |