본문 바로가기
C,C++/C++

[C++] const 키워드 위치에 따른 적용 범위 (포인터 및 멤버 함수)

by woohyeon 2019. 11. 27.
반응형

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 멤버 함수만 호출할 수 있도록 한다.

 




댓글