const를 적극 활용하기

Programming/Effective C++ 2013. 12. 28. 15:13 Posted by gaeddong2

const

: const 키워드가 붙은 객체는 외부 변경을 불가능하게 한다.(어떤 값(객체의 내용)이 불변이어야 한다.)

: 클래스 바깥에서는 전역 혹은 네임스페이스 유효범위의 상수를 선언하는데 쓸 수 있다.


char *p = greeting;            비상수 데이터

const char *p = greeting;    비 상수 포인터, 상수 데이터

char const *p = greeting;    비 상수 포인터, 상수 데이터

char * const p = greeting;    상수 포인터, 비 상수 데이터

const char * const p = greeting; 상수 포인터, 상수 데이터


const 키워드가 *표의 왼쪽에 있으면 포인터가 가리키는 대상이 상수

const가 *표의 오른쪽에 있는 경우엔 포인터 자체가 상수이다.

const가 *표의 양쪽에 다 있으면 포인터가 가리키는 대상 및 포인터가 다 상수


STL반복자(iterator)

: T* 포인터와 흡사(반복자를 const로 선언하는 일은 포인터를 상수로 선언하는 것)

반복자는 자신이 가리키는 대상이 아닌 것을 가리키는 경우가 허용되지 않지만, 반복자가 가리키는 대상 자체는 변경이 가능하다.

iterator iter

*iter = 10;(가능)

++iter(불가능)

변경이 불가능한 객체를 가리키는 반복자가 필요하다면 const_iterator을 쓰면 된다. (반복자가 가리키는 대상자체 변경 가능)

const_iterator cIter

*cIter = 10; (불가능) -> *cIter가 상수이기 때문에

++cIter (가능)



함수 반환 값을 상수로 정해주면, 안전성이나 효율을 포기하지 않고도 사용자측의 에러 돌발 상황을 줄이는 효과를 가져올 수 있다.

결국, const는 매개 변수 혹은 지역 객체를 수정할 수 없게 하는 목적이라면 선언하도록 한다.


<상수 멤버 함수>

멤버 함수에 붙는 const의 역할 : 해당 멤버 함수가 상수 객체에 대해 호출될 함수.

1. 클래스로 만들어진 객체를 변경할 수 있는 함수는 무엇이고, 변경할 수 없는 함수는 무엇인가를 알기 위함.

2. 상수 객체를 사용할 수 있게 하자.


const 키워드가 있고 없고의 차이만 있는 멤버 함수들은 오버로디잉 가능하다.


어떤 멤버함수가 상수 멤버(비트수준 상수성)

: 어떤 멤버 함수가 그 객체의 어떤 데이터 멤버도 건드리지 않아야 그 멤버 함수가 const임을 인정하는 개념

-> 제대로 const로 동작하지 않는데 이 비트 수준 상수성 검사를 통과하는 멤버 함수들이 적지 않다. 어떤 값으로 초기화된 상수 객체를 하나 만들어 놓고 이것에다 상수 멤버 함수를 호출했더니 값이 변해버린 경우가 있다.


< 논리성 상수성이란 개념은 이런 상황은 보완하는 대체 개념 >

- 상수 멤버 함수라고 해서 객체의 한 비트도 수정할 수 없는 것이 아니라 일부 몇 비트 정도는 바꿀 수 있되, 사용자측에서 알아채지 못하게 하면 상수 멤버 자격이 있다는 뜻이다.


mutable - 비정적 데이터 멤버를 비트 수준 상수성의 족쇄에서 풀어 주는 키워드


< 상수 멤버 및 비상수 멤버 함수에서 코드 중복 현상을 피하는 방법 >

- const 껍데기를 캐스팅으로 날리는 방법 (캐스팅은 좋지 않은 개념이다. ) 

비상수 상수 버전을 호출하도록 구현하는 것이다. 

*this 타입 캐스팅 -> 원래의 타입에서 const 타입을 바꾸는 것이다.


* const를 붙여 선언하면 컴파일러가 사용상의 에러를 잡는데 도움을 준다.

const는 어떤 유효범위에 있는 개체에도 붙을 수 있고, 함수 매개변수 및 반환 타입에도 붙을 수 있으며, 멤버 함수에도 붙을 수 있다.

* 컴파일러 쪽에서 보면 비트수준 상수성을 지키지만 논리적인 상수성을 사용해서 프로그래밍 하여야 한다.

* 상수 멤버 및 비상수 멤버 함수가 기능적으로 서로 똑같게 구현되어 있을 경우에는 코드 중복을 피해야 한다. -> 이 때, 비상수 버전이 상수 버전을 호출하도록 만든다.








'Programming > Effective C++' 카테고리의 다른 글

#define보다는 const, enum, inline을 떠올리자  (0) 2013.12.28