방프리

16.07.15. Effective C++ 1. C++에 왔으면 C++의 법을 따릅시다. (항목3) 본문

C++/Effective C++

16.07.15. Effective C++ 1. C++에 왔으면 C++의 법을 따릅시다. (항목3)

방프리 2020. 1. 3. 01:48

항목 3: 낌새만 보이면 const를 들이대 보자!

 

const란? 정말 좋은 키워드 왜냐하면 '의미적 제약'을 소스 코드에서 붙일 수 있고 이 원칙을

 

컴파일러는 항상 지켜준다. 만약 어떠한 변수의 데이터가 절대 변하지 않는 수라면 

 

무조건!! const를 붙여주는 것이 맞다. 예전에 c++강의 수업을 들었을 때

 

정말 훌륭한 c++개발자는 const를 잘 활용하는 개발자라고 하는데 이는 틀린 말이 아니다.

 

여기서 중요한 점은 대개 개발자들 중 const의 위치를 두고 어떠한 것을 쓰는지는 천차만별이기

 

때문에 밑의 예를 눈에 익히는 것이 좋다.

 

1. void f1 ( const Widget *pw);   //f1은 상수 Widget 객체에 대한 포인터를 매개변수로 취함

2. void f2 ( Widget const *pw);   //f2또한 마찬가지 

 

STL 반복자는 포인터를 본뜬것이기 때문에, 기본 동작 원리는 T*와 매우 흡사하다. 

 

반복자는 자신이 가리키는 대상이 아닌 것을 가리키는 경우 허용되지 않지만

 

반복자가 가리키는 대상 자체는 변경이 가능하다.

 

ex)

const std::vector<int>::iterator iter = vec.begin();

 

*iter = 10;

++iter //컴파일 에러 iter는 상수이기 떄문

 

std::vector<int>::const _iterator Citer = vec.begin();

 

*Citer = 10; //에러 const로 지정된 상수는 값 변경 불가

++Citer

 

const의 가장 큰 장점은 함수 선언 시 사용할 떄이다. 함수 선어문에 있어서 const는 함수 반환값,

 

각각의 매개변수, 멤버 함수 앞에 붙을 수도 있고, 함수 전체에도 const 성질이 붙을 수 있다.

 

함수 반환값을 상수로 정해주면 안전성이나 효율을 포기하지 않고도 사용자측의 에러 돌발 상황을

 

줄이는 효과를 볼 수 있다.

 

ex)

class Rational { .... };

 

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

 

이럴 경우 다음의 상황에 대처가 가능하다.

 

Raional a, b, c;

 

...

 

(a * b) = c;  

 

또 다른 경우

 

if( a * b  = c)

{

   ....

}

 

operator*의 반환값을 const로 붙일 경우 저 상황에 대해 에러를 미연에 잡을 수 있다.

 

const의 매개변수는 지역 객체 특성과 비슷하므로 넘어간다. 하지만 수정 할 수 없게 

 

하는 것이 목적이라면 지속적으로 const를 붙이는 것이 좋다.

Comments