const는 상수를 설정하는것으로 아주 얕게 알고 있었고 단순히 값이 변하지않는다는것으로 알고있었습니다.
javascript에서는 const 를 이용해서 단순히 값을 안바뀌는 변수 정도로만 생각했는데 C++ const 한정어는 여러가지의 사용방법이있는거 같습니다.
C와 C++언어에서는 포인터에대한 const 한정어가 허용됩니다. 이때 const한정어를 넣는 위치에 따라서도 의미가 달라지기도합니다.
const int a = 10;
위와 같은 문장이 있을경우 해당 문장은 저는 이렇게 해석하면 쉽게 이해가 됐습니다.
바뀌지않는 정수 a = 10;
역시 영어보단 한글이 더 직관적이죠?
C++언어에서는 변수를 선언하고 초기화하는 한문장을 만들때 데이터타입 변수명 ; 이런형식으로 선언합니다.
const 한정어는 초기화를 해주어야 합니다.물론 대입연산자 “=” 를 활용하여 해당하는 데이터타입을 선언과 동시에 할당하여 초기화를 하죠
이제 a 는 바뀌지않는 값 10을 가진 변수가 되었습니다.
여기서 조금더 어려운 개념인 const 한정어가 사용되는 포인터와 주소값의 예를 들어보겠습니다.
int a =10 , b =20; //a,b에 각각 int형 10으로 초기화 해주었습니다.
const int *ptr = &a; // 포인터변수 ptr은 a의 주소를 가리킵니다.
*ptr = 30; // error!!
ptr = &b; // ok!!
위의 문장에서 ptr은 const int * 로 정의 되어있습니다 이는 ptr이 const int에 대한 포인터라는 의미 입니다.
비록 a가 const로 지정되지는 않았지만 ptr이 상수에 대한 포인터라고 지정했으므로 *ptr의 값을 수정하는것은 허용하지 않습니다. 하지만 주소를 변경하는 다음문장은되는게 이상하죠?
*즉, const int *ptr = &a;에서 ptr는 'const int'를 가리키는 포인터이므로, ptr을 통해 가리키는 값(ptr)은 변경할 수 없습니다. 그래서 *ptr = 30;은 오류를 발생시킵니다.
그러나 ptr 자체, 즉 ptr가 가리키는 주소는 const로 지정되지 않았습니다. 따라서 ptr는 다른 주소를 가리킬 수 있습니다. 그래서 ptr = &b;는 허용됩니다.
주소를 변경하는것을 막으려면 const 의 위치를 바꾸어 줘야 합니다.
int a =10 , b =20; //a,b에 각각 int형 10으로 초기화 해주었습니다.
int * const ptr = &a; // 포인터변수 ptr은 a의 주소를 가리킵니다.
*ptr = 30; // ok!!
ptr = &b; // error!!
const 한정어 const int *ptr 이 경우, ptr은 const int를 가리키는 포인터입니다. 따라서 ptr을 통해 가리키는 값(*ptr)은 변경할 수 없습니다. 그러나 ptr 자체, 즉 ptr이 가리키는 주소는 변경 가능합니다.int * const ptr: 이 경우, ptr은 const 포인터입니다. 즉, ptr이 가리키는 주소 자체가 변경할 수 없습니다. 그러나 ptr을 통해 가리키는 값(*ptr)은 변경 가능합니다.
const int *ptr = &a; // 값을 변경할수없음
int * const ptr = &b; // 주소를 변경할수없음
const한정어의 위치에따라 포인터는 다르게 작동하는것을 반드시 알고 넘어 가야 할것 같습니다.
저또한 공부를 하는입장이지만 이렇게 글을 남김으로써 더욱 이해가 잘되고 다음에 다시 볼때도 편하겠네요
'컴퓨터 과학 > C++' 카테고리의 다른 글
lvalue , rvalue 차이점 정확하게 이해하자 (0) | 2023.12.04 |
---|---|
C++ 포인터, 동적 메모리할당 new와 delete 정리 (2) | 2023.12.03 |
C++ , 연산자 다중정의 하는방법 연산자 다중정의란? (1) | 2023.12.02 |
3.4 inline 함수 (0) | 2023.12.01 |
C++ 객체지향 언어 추상화와 캡슐화의 정리 (0) | 2023.08.20 |