11장 - const

1) const란?

상수를 의미하는 ‘constant’의 줄임말로, 변경해서는 아뇌는 대상을 선언할 때 사용한다.


2) const 변수와 매개변수

const는 전역변수, 클래스 멤버 등 모든 종류의 변수에 붙일 수 있다. 포인터에도 붙일 수 있는데, 포인터 자체에 붙일 것인지 포인터가 가리키는 값에 붙일 것인지 확실히 해야한다.

const가 여러개 붙어서 의미를 파악하기 어렵다면, 오른쪽에서 왼쪽으로 읽어보자. int* const ip라면 ip는 int포인터에 대해 const를 적용한 것이라고 이해하는 것이다.

  • 가리키는 값에 const

      const int* ip;
      int const* ip;
      ip = new int[10];
      ip[3] = 5;      // 에러 발생!
    
  • 포인터 자체에 const

      int* const ip = nullptr;
      ip = new int[10]; // 에러 발생!
    
  • 둘 다 const

      int const* const ip = nullptr
    

    가리키는 주소도, 해당 주소의 값도 변경할 수 없다.

참고로 레퍼런스에도 const를 붙일 수 있다. 심지어 레퍼런스에 대한 레퍼런스는 생성이 불가하기에 참조 단계가 한 단계 뿐이다. const int& ref = z와 같이 사용하며, 변수의 값을 변경하지 못하는 조건으로 매개변수를 넘기는데 유용하다.


3) constexpr 키워드

상수 표현식을 나타낸다. 상수 표현식은 컴파일 시간에 계산되는 표현식이다.

constexpr int getArraySize(){ return 32 };

int main(){
	int myArray[getArraySize()]; // constexpr이 아닌 const였으면 에러!
	return 0;
} 

미리 계산되는 만큼 제약사항이 많다.