C++

[C++] const 위치에 따른 차이점

Honey Badger 2023. 3. 26. 02:03

const는 상수라는 뜻으로 뒤에나오는 값의 수정, 변경이 불가함을 나타낸다. const는 변수와 함수에서 주로 사용되는데 그 위치에 따라 의미가 헷갈리는 경우가 많다.  참고로 const화 되어있는 변수를 레퍼런스변수나 포인터변수로 접근하려면 참조자도 const화 해주어야 한다. 

 

 

 

 

1. 변수

const int num1 = 0; //num1의 int 형식의 값을 변경할 수 없습니다.
int const num2 = 0; //num2의 값을 변경할 수 없습니다.

num1 = 1; //ERROR!!!
num2 = 1; //ERROR!!!

변수는 const가 어디에 붙든 의미가 크게 달라지지 않고 변수의 값을 변경할 수 없다는 결과도 똑같다. 하지만 포인터나 레퍼런스에서는 그 결과가 달라진다. 

 

 

 

 

 

2. 포인터

int num1 = 0;

//num1의 주솟값을 각각 int형 포인터 변수 ptr1,ptr2,ptr3에 저장한다.
const int *ptr1 = &num1; //ptr1의 int형 값을 변경할 수 없다. (여기서 변경불가한 값은 '0'이라는 int값.)
int const *ptr2 = &num1; //ptr2의 *ptr2형 값을 변경할 수 없다. (여기서 변경불가한 값은 'num1')
int* const ptr3 = &num1; //ptr3자체의 값을 변경할 수 없다. (여기서 변경불가한 값은 ptr3가 소유한 num1의 주솟값.)


//이제 새로운 변수 num2의 주솟값을 저장하거나, 역참조를 통해 직접 값을 넣어보자. 
int num2 = 1;

*ptr1 = num2; //ERROR : *ptr1는 포인터변수 ptr1의 int형 값이므로 변경할 수 없다.
ptr1 = &num2; //POSSIBLE : ptr1는 int형 값이 아닌 int형의 주솟값이므로 변경할 수 있다.

*ptr2 = num2; //ERROR : *ptr2형에 대해 const가 붙어있으므로 당연히 변경할 수 없다.
ptr2 = &num2; //POSSIBLE : *ptr2형에 대한 const이므로 주솟값은 변경 가능하다.

*ptr3 = num2; //POSSIBLE : ptr3*가 아닌 ptr3의 값이 const이므로 ptr3*의 값은 변경 가능하다. 
ptr3 = &num2; //ERROR : ptr3의 값이 const이므로 변경 불가능하다.

 

 

 

 

3. 레퍼런스

int num1 = 0;

const int & ref1 = num1; //ref1의 int형 값을 변경할 수 없다.
int const & ref2 = num1; //ref2의 값을 변경할 수 없다.
int & const ref3 = num1; //ref3 처럼 사용하진 않는다. 

ref1 = 1; //ERROR : ref1의 int형 값에 const가 있으므로 변경불가하다.
ref2 = 2; //ERRPR : 레퍼런스 변수를 선언할 때 &를 붙이고 사용할 땐 일반변수처럼 쓰므로 ref2의 값은 변경불가.
ref3 = 3; //컴파일러에 따라 다르다.

 

 

'C++' 카테고리의 다른 글

객체 지향이란?  (2) 2023.05.13
클래스, 객체, 인스턴스란 무엇일까?  (0) 2023.05.13
[C++11] 람다식  (0) 2022.10.19