티스토리 뷰

언어

C++ 아주 헷갈리는 const 키워드

jazzmaster 2019. 6. 6. 18:43

면접 대비용으로 작성한 것이라 나를 제외한 보는 사람에겐 두서 없어 보일 수 있음.

 

 

 

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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함