[C++]3. 낌새만 보이면 const 를 들이대 보자!(1)

const 를 한마디로

의미적인 제약을 소스 코드 수준에서 붙인다는 점 //const 키워드가 붙은 객체는 외부 변경을 불가능하게 한다컴파일러가 이 제약을 단단히 지켜준다


const 의 기본 사용 방식

char greeting[] = “Hello”;

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

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

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

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

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

참고로 포인터가 가리키는 대상을 상수로 만들 시
void f1 ( const Widget *pw );

void f2 ( Widget const *pw );

둘 다 같은 의미이다. 위의 설명과 같이 * 의 왼쪽이냐 오른쪽이냐가 중요하다.


STL 반복자( iterator ) 에서의 const

iterator 는 포인터를 본뜬 것이고 기본적인 동작원리는 T* 포인터와 같다.
즉, iterator 를 const 로 선언하는 것은 포인터를 상수로 선언하는 것(T* const 포인터)과 같다.
iterator 는 자신이 가리키는 대상이 아닌 것을 가리키면 안되지만 가리키는 대상 자체는 변경이 가능하다.
만약 변경이 불가능한 객체를 가리키는 iterator( const T* 포인터 )가 필요하다면 const_iterator 를 쓰면 된다.
std::vector vec;

const std::vector::terator iter = vec.begin(); // iter 는 T* const 처럼 동작한다.
*iter = 10; // iter가 가리키는 대상을 변경한다
++iter; // Error! Iter 는 상수이다.

std::vector::const_iterator cIter = vec.begin(); // cIter 는 const T* 처럼 동작한다.
*cIter = 10; // Error! *cIter 가 상수이다
++cIter; // cIter를 변경하기 때문에 상관없다


함수 선언에서의 const

함수 선언문에 있어서 반환 값, 매개변수, 멤버 함수, 함수 전체 에 대해 const를 붙일 수 있다.
함수 반환값을 상수로 정해줄 시 사용자 측의 에러 돌발 상황을 줄이는 효과를 줄 수 있다
class Rational { … };

const Rational operator* ( const Rational& lhs, const Rational& rhs );

operator* 의 반환 값이 상수 객체가 되게 되면 다음과 같은 실수를 미연에 방지할 수 있다.
Rational a, b, c;

( a * b ) = c ; // a*b 의 결과에 operator= 를 호출하거나

if ( a * b = c ) .. // 실수로 생겨난 오타 == → = 를 방지할 수 있다

by 일찍자라 | 2007/04/04 01:36 | Effective C++ | 트랙백(1)

Tracked from 최익필의 이름없는 블로그 at 2008/07/27 12:49

제목 : 항목 3. 낌새만 보이면 const를 들이대 보자!
이유 1. 의미적으로 상수로 표현하기보단 실질적으로 상수로 표현하는 const가 더 안정적이기 때문이다. (함수 내부에서 값을 건드리지 않는다는 의미만 가지고 코딩할게 아니라 진짜로 표현하는게 더 좋기 때문이다) 주의점 1. 함수의 반환값 함수의 매개변수, 함수의 정의 구역을 모두 const로 할수 있는지 생각해 보아야 한다. 2. 상수객체와 비상수객체는 함수의 오버로딩 대상에 포함된다. - 즉 상수객체만 받거나 비상수객체만 받거나 둘의 차이를......more

◀ 이전 페이지          다음 페이지 ▶