const 키워드는 대상을 상수화한다.
즉 대상이 초기화 이후로 값 수정을 하지 못하도록 만든다.
const 키워드는 위치에 따라 적용되는 대상이 다르다.
1. 포인터가 가리키는 대상의 값을 변경 못하게 하려면 다음과 같이 선언한다.
const char* c_ptr;
- 포인터가 가리키는 대상의 값을 변경할 수 없다.
- 하지만 포인터가 가리키는 대상(주소값)을 변경할 수 있다.
2. 포인터가 가리키는 대상(주소)을 변경 못하게 하려면 다음과 같이 선언한다.
char* const ptr;
- 포인터가 가리키는 대상(주소)을 변경할 수 없다.
- 하지만 포인터가 가리키는 대상의 값을 변경할 수 있다.
3. 대상과 대상의 값을 모두 변경하지 못하게 하려면 다음과 같이 선언한다.
const char* const c_ptr;
- 포인터가 가리키는 대상과 그 값을 모두 변경할 수 없다.
구조체 또는 클래스에서 멤버 함수 선언 시 const 키워드 사용하기
const 키워드는 단순히 값을 변경하지 못하게 막는 것뿐만 아니라
프로그래머에게 "이 대상은 값을 변경하지 않을 것 입니다", "객체 수정이 일어나지 않는 동작입니다" 라는 의미를 전달하기도 한다.
멤버 함수 선언 시 "해당 함수 내에선 객체 내 데이터 변수들의 수정 작업이 일어나지 않습니다" 라는 의미를 전달하고 싶다면 다음과 같이 선언한다.
string getName() const { return this->name; }
함수 이름 뒤에 const 키워드를 사용한다.
위 함수는 멤버 변수인 name을 반환하는 getter 함수이고, 수정 동작이 전혀 필요하지 않으므로 const 멤버 함수로 선언하는게 좋다.
const 멤버 함수 내에선 멤버 변수 수정이 불가능하다.
즉 const 멤버 함수를 호출하는 객체는 이 함수가 종료될 때 까지 객체 내부를 변경할 수 없다.
아래 const 멤버 함수 getName에서 멤버 변수인 age를 변경하려고 할 경우 오류를 발생시킨다.
class Person
{
public:
string getName() const
{
// this->age = 25; // const 멤버 함수 내에서 내부 데이터를 수정할 수 없다.
return this->name;
}
private:
string name;
unsigned int age;
};
멤버 변수를 수정하지 못하는 것이지 매개변수로 들어온 변수나 함수 내의 지역변수를 수정하지 못하는 것은 아니므로 혼동하지 말자.
const 멤버 함수는 const 객체를 다룰 때에도 호출할 수 있다. 마찬가지로 const 객체를 다룰 때 const가 아닌 멤버 함수는 호출할 수 없다. 예를 들면 다음과 같이 const 객체는 non-const를 함수를 호출하지 못한다.
class A
{
public:
void ConstFunc() const {}
void NonConstFunc() {}
};
int main()
{
const A constObj;
constObj.ConstFunc(); // 가능
constObj.NonConstFunc(); // 컴파일 에러
return 0;
}
const 객체는 객체를 수정하지 않겠다는 의미이다.
만약
const 객체가 const가 아닌 멤버 함수를 호출하게되면 의도와 달리 값의 변경이 일어날 수 있는 아이러니한 상황이 발생하게 된다.
따라서 컴파일러는 이를 미리 차단하고 const 객체는 const 멤버 함수만 호출할 수 있도록 한다.
'C,C++ > C++' 카테고리의 다른 글
[C++] 가상 함수와 가상 소멸자에 대해 알아보자(feat. 가상테이블) | virtual (0) | 2019.12.10 |
---|---|
[C++] 포인터와 레퍼런스(참조)의 차이를 이해해보자 (3) | 2019.12.05 |
[C++ STL] 라이브러리 알고리즘의 반복자 인자가 마지막 요소의 다음을 참조하는 이유 (0) | 2019.11.25 |
[C++ STL] <algorithm> std::remove_if 함수 (0) | 2019.11.08 |
[C++ STL] <algorithm> std::search() 함수 (0) | 2019.11.07 |
댓글