const
Effective C++ 공부 내용입니다.
const
const
키워드가 붙은 객체는 외부 변경을 불가능하게 만든다.- 이를 이용해 값이 변하면 안 되는 것을 다른 프로그래머와 이야기할 수단이며, 나 자신도 해당 규칙을 지켜야 한다.
- 포인터의 경우 포인터 자체를 상수로, 그리고 포인터가 가리키는 데이터를 상수로 지정이 가능하다.
char *p = someting; // 비상수 포인터 및 데이터
const char *p = someting; // 비상수 포인터, 상수 데이터
char * const p = someting; // 비상수 포인터, 상수 데이터
const char * const p = someting; // 상수 포인터, 상수 데이터
const 키워드가 * 왼쪽에 있으면 포인터가 가리키는 대상이, 오른쪽에 있으면 포인터 자체가 상수가 된다.
- 사람마다 표현 방법이 살짝 다를 수 있는데, 아래 두 표현은 같은 뜻이다.
const A *p
A const *p
STL 반복자에 const 사용
- STL 반복자를 const로 선언하는 것은 포인터를 상수로 선언하는 것과 같다.
- T* const 포인터; 가리키는 대상은 변경이 가능하지만 포인터는 변경이 불가능
- 반대로 가리키는 대상을 변경 못하도록 하고 싶다면
const_iterator
를 사용하면 된다.
vector<int> age;
const vector<int>::iterator age_iter = age.begin();
*age_iter++; // 나이 변경 가능 ; 해마다 나이가 변경
++age_iter; // 특정 사람의 나이를 가리키는데, 해당 사람이 아닌 다른 람으로 변경 불가능 불가능 ; 상수이기 때문에
vector<string> nameList;
vector<string>::const_iterator nameList_iter = nameList.begine();
*nameList_iter = "홍길동"; // 해당 사람의 이름은 변경 불가능(개명이 불가능 하다고 가정) ; 상수이기 때문에
++nameList_iter; // 다른 사람의 이름에 접근하기 위해 iter자체는 변경 가능
const를 함수에 사용
-
함수에서 반환값, 매개변수, 멤버 함수, 함수 전체에 대해
const
를 사용할 수 있다. -
함수 반환 값을 상수로 설정하면 안정성이나 효율을 포기하지 않고도 에러를 줄일 수 있다. 아래 예시
const A operator*(const A& x, const A& y);
- 클래스 A에 해당 연산자 오버로딩이 있고, 다음과 같은 객체가 있을 때,
A x, y, z;
(x * y) = z;
이러한 말도 안 되는 실수를 할 수 있다.
- 당연히 곱셈 결과 값에 어떤 값을 할당하려고 하는 사람은 없을 것이다.
- 근데
if(x * y = z)
처럼 if문에서=
하나를 빼먹는 실수를 막을 수 있다.
- 마지막으로 매개변수에 대해서도 기본적으로
const
를 사용하자. - 특히 매개변수 그리고 지역 객체를 변경 못하도록 하는 의도가 있다면 잊지말자.
댓글남기기