MSVC2005 에서 warring 뜨지만 컴파일 되는 것을 확인 하고 코드 제시한다.
전제조건 : 프로그램의 구조를 바꾸지 말것
문제 : const 를 어디에 더하고 어디에 빼야 하는지, 주석으로 달아 둘 것
이 부분에서 매개변수에 const 를 붙였으나 값에 의한 전달이기 때문에, 원본에 침해가 없을 것이므로 아무 효과가 없음, .. 또한 값에 의한 전달을 매개변수로 하는 함수의 경우 const 붙이나 안붙이나 컴파일러는 한개의 함수로 인식함,
그 증거 코드
가이드 라인
함수 선언에서 값으로 넘겨지는 매개변수에 const 사용을 피하자, 사용해야 하더라도, 만약 매개변수가 바뀌면 안될때는 원래 함수에 const 를 써라.
이 코드는 첫번째 말한 부분인 값에 의한 전달 일 경우 const 를 뺀다. 또한 내부 변수가 변하는게 없어야 하므로 const 멤버 함수로 써 선언한다. (무슨 말이냐하면 Point GetPoint ( int i ) const 이렇게 쓰라는 뜻. effective C++ 보면 좀 더 자세히 나온다.)
부수적으로
1. 반환타입에도 const 를 붙여주는것이 좋다고 설명을 한다. 왜냐하면 멍청하게 GetPoint(0) = Point(1,1); 이라고 쓰는 사람이 있을까 봐서다..(임시 객체가 생성에다가 값을 집어 넣어도 ; <-- 만나는 즉시 값이 사라지기 때문이다.) 참고로 기본 자료형은 알아서 막아 준다.(컴파일 타임에서 체크해 준다. MSVC2005 )
2. 만약 의도된 코드라면 & 형태로 반환되었을 때 효과를 보게 된다. 하지만 .. 가독성이나 여러모로 고려했을때 좋지 않을 것이라고 나는 개인적으로 생각한다.( .. 뭐는 되고 뭐는 안되면 오히려 혼동만 사는 행동일테니까 말이다.)
반대로 어떤 사람은 내장형식(기본자료형)이 중복 될수 있어 반대 한다고 하는데, 이게 무슨 말인지 모르겠다. 아시는 분은 ... 설명 부탁드립니다.
이 부분은 const 멤버 함수로 쓰면 좋다. 이 부분에 약간 짜증나는게 있다면 size_t 형으로 size() 함수가 반환하기 때문에 int 형 반환이 아닌 size_t 형 반환으로 바꾸는게 좋다. STL 의 대부분 size() 함수는 size_t 형 반환이기 때문에, 루프를 돌리릴때는 size_t 형을 활용하는게 더 좋다.(형변환은 .. 예의가 아니다!) 즉 size_t GetNun..... const 형식으로 바꾸는게 좋다.
여기서 잠깐
책의 a의 내용은 좀 혼동 스럽다. 뭘 말하고자 하는거지? 참조에 의한 전달 시 const 가 문제가 된다는건가? 이건 당연한건데..? b의 내용은 템플릿 설명을 방해할 수 있다고 하는데... 가독성 이야기 일 듯
이 코드의 경우
1. 외부에 의해서 변경되는것이 없으므로 const 멤버 함수로 써주는게 더 안전하다는 것이다.
2. 전제 조건으로 CalcArea 도 const 로 만들어 주어야 하며 area_ 를 mutable 로 선언해야 한다.
이 코드의 경우 area_ 를 mutable 로 선언하고 함수 자체는 const 로 설정한다. 왜냐하면 일관성 때문이다. 굳이 const 를 안써도 되지만, 이 내부에서 area_ 빼고 그 어떤것도 건들지 않겠다는 것을 알리므로, const 의 일관성을 유지한다고 한다;(... 오히려 더 복잡해 지지 않나? 이런건 안써도... mutable 지원하는 컴파일러가 뭐가 있으려나..)
1. iterator 의 i 값을 변경하지 않으므로 const_iterator 를 벹어 내게 하는게 좋다.
2.전제조건으로 함수가 const 함수여야 한다.
나머지는 다 수정한 코드로 보여 주므로 마친다.
... 정말 const의 모든 용법을 본거 같다.
'책 정리 > Exceptional C++' 카테고리의 다른 글
항목 4 : 최대 재사용 가능한 일반 컨테이너 - 파트 1 (난이도 8) (0) | 2008.10.06 |
---|---|
항목 47 : 흐름 제어 (난이도 : 6) (0) | 2008.10.04 |
항목 46 : 포워딩 함수 (난이도 : 3) (0) | 2008.10.04 |
항목 45 : BOOL (난이도 7) (0) | 2008.10.04 |
항목 44 : 캐스트 (난이도 : 6) (2) | 2008.10.04 |
항목 42 : 변수 초기화 (난이도 : 3) (0) | 2008.10.03 |
항목 3 : 대·소문자 구분 없는 문자열 - 파트 2 (난이도 5) (0) | 2008.09.10 |
항목 2 : 대·소문자 구분 없는 문자열 - 파트 1 (난이도 7) (0) | 2008.09.09 |
항목 1 : 반복자( iterator ) 난이도 7 (0) | 2008.09.09 |
Exceptional C++ : C++ 프로그래머를 자극하는 47개의 재미있는 퍼즐 문제 (0) | 2008.09.08 |
최근댓글