C++

[C++] const 위치의 의미와 사용 방법

yeon-96 2023. 6. 17. 17:14
반응형

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는 변경 할 수 있게 된다.

 

반응형