[C++] const 변수/const 포인터

우니·2022년 10월 29일
0

const 멤버변수

멤버변수를 선언할 때 const를 붙여주면 상수가 된다.
const 상수는 초기화된 이후 변경할 수 없다.

class Person
{
public:
	Person(void);
    Person(int id);
private:
	const int id;
}

const 상수는 반드시 생성될 때 초기화되어야 하므로 생성자 함수를 다음과 같이 만들어준다.

Person::Person(void) : id(0)
{
}
Person::Person(int id) : id(id)
{
}

const 포인터

앞서 봤듯이, const는 변수를 상수화 시킨다. 상수화 된 변수는 이후 변경이 불가능하다.
const를 포인터 변수에 붙여도 똑같다.

그런데 const의 위치에 따라 동작하는 방식이 다르다.
무슨 말이냐면, 예를들어 변수 a에 대하여

int a = 100;

//1.상수 포인터
int* const ptr = &a 

//2.상수 지시 포인터
const int* ptr = &a 

1,2번이 명백히 다르다는 뜻이다
공부하면서도 굉장히 헷갈렸는데.. 하나하나 차근차근 알아보도록 하자.

1. 상수 포인터(const pointer)

int a = 100;
int b = 200;

int* const ptr = &a;
ptr2 = &b //컴파일 에러
*ptr2 = 300; //컴파일 에러 X

const 우측에 포인터 변수 값이 위치한다. 즉, 포인터 변수(ptr)를 const 하겠다는 뜻이다. 그렇기에 가리키는 곳은 변경할 수가 없다. 대신에, 참조하는 값은 변경할 수 있다.

2. 상수 지시 포인터(Pointer to Const)

int a = 100;
int b = 200;

const int* ptr = &a;
ptr = &b;//컴파일 에러X
*ptr = 300;//컴파일 에러

const 키워드가 가장 좌측에 있다. 이는 int* ptr를 상수화한다는 것이다. 가리키는 대상은 변경할 수 있다. 그러나 그 대상의 값을 역참조하여 수정할 수는 없다.

번외) 포인터를 가리키는 상수 포인터

그렇다면 가리키기고 있는 대상도 변경할 수 없고 가리키고 있는 대상의 값도 변경할 수 없도록 하려면 어떻게 작성해야 할까?

consnt int* const ptr = &a

위와 같이 작성하면 된다.

0개의 댓글