[C++] const 위치의 의미와 사용 방법
C++ 에서 const는 "상수"를 뜻한다.
따라서 C++에서도 그 대상을 변경하지 않는 "상수"를 의미함
C++ 에서의 const는 위치에 따라 의미하는 바가 완전히 달라진다.
Const 변수
const 비-멤버 변수
const int num = 1; // 일반적인 표현
int const num = 1; // 위와 같은 의미
num = 2; // Compile Error
위의 두 방식 모두 같은 뜻으로 num은 변할 수 없는 상수가 되는 것을 의미한다.
JAVA에서 배운 const와 같다고 보면 된다.
const 멤버 변수
const 변수는 반드시 선언 시 초기화를 해야 하며 초기화 하지 않으면 컴파일 에러가 발생
그래서 class의 멤버 변수를 const로 선언 시에는 반드시 초기화 리스트(Initialize List)를 사용해야 합니다.
class Foo
{
const int num; // 메모리 할당이 아님
Foo(void)
: num(1) // const int num = 1;
{
}
};
class Bar
{
const int num;
Bar(void)
{
num = 1; // Compile Error
// const int num;
// num = 1;
}
};
Foo의 num은 생성자에서 초기화 리스트로 1로 초기화 하고 있는데, 이는 const int num = 1;과 동일한 의미이다.
그런데 Bar의 num은 생성자에서 초기화 리스트를 사용하지 않고 함수 내부에서 초기화를 시도 하고 있다.
이것은 초기화가 아니라 const int num; 으로 const 변수를 선언한 후 num = 1;을 시도하는 것이기에 컴파일 에러가 발생
const 포인터 변수
포인터와 const를 사용할 때는 두가지 경우가 있다.
(1) const 위치가 맨 앞에 있으면서 포이터 변수가 가리키는 값에 대하여 상수화를 시키는 경우
int num = 1;
const int* ptr = # // *ptr을 상수화
*ptr = 2; // Compile Error
num = 2; // Pass
*ptr = 2;는 ptr이 const변수이기 때문에 컴파일 에러가 발생 하지만 num = 2;는 num이 const변수가 아니기 때문에 가능
포인터 변수가 가리키는 값 자체 num이 상수화가 된 것이 아니다.
(2) const 위치가 type과 변수 이름 사이에 있으면서 포인터 변수 자체를 상수화 시키는 경우
int num1 = 1;
int num2 = 2;
int* const ptr = &num1; // ptr을 상수화
ptr = &num2; // Compile Error
포인터 변수란 대상의 주소 값을 저장하는 변수이다. 즉 ptr은 자기 자신을 상수화 시키는 것이기 때문에
num2의 주소값을 변경하려고 하면 컴파일 에러가 발생한다.
즉 int* const ptr = &num1; 는 ptr을 상수화 시키는 코드이다.
const 멤버 함수
int GetString(void) const; // Compile Error
class Foo
{
int num = 1;
int GetNum(void) const
{
int a = 1;
a++; // 지역 변수는 가능
num++; // Compile Error
return num;
}
};
const 멤버 함수는 이름 그대로 class의 멤버 함수만 const로 상수화를 시킬 수 있고
비-멤버 함수는 const 함수로 선언이 불가능 하다.
const의 위치는 함수 선언문 맨 뒤, 이 의미는 해당 멤버 함수 내에서는 모든 멤버 변수를 상수화 시킨다는 의미이다.따라서 위와 같이 멤버 변수인 num은 변경할 수 없고 지역 변수인 a는 변경 할 수 있게 된다.