방프리
16.07.15. Effective C++ 1. C++에 왔으면 C++의 법을 따릅시다. (항목3) 본문
항목 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를 붙이는 것이 좋다.
'C++ > Effective C++' 카테고리의 다른 글
17.07.04. Effective C++ 2. 생성자, 소멸자 및 대입 연산자 (항목8) (0) | 2020.01.05 |
---|---|
17.6.13. Effective C++ 2. 생성자, 소멸자 및 대입 연산자 (항목7) (0) | 2020.01.05 |
16.1.28. Effective C++ 1. C++에 왔으면 C++의 법을 따릅시다. (항목5, 6) (0) | 2020.01.04 |
16.07.20. Effective C++ 1. C++에 왔으면 C++의 법을 따릅시다. (항목4) (0) | 2020.01.04 |
16.07.14. Effective C++ 1. C++에 왔으면 C++의 법을 따릅시다. (항목1, 2) (0) | 2020.01.03 |