이 문제에 대해서, 많은 책들이 지적하고 있다. 가장 효과적인 해결책을 이 책에서도 설명하고 있는데, 우선 보도록 하자.
1 ) 다음 코드는 무엇인가?
이 코드는 coll1 컨테이너하나를 생성하고, 그곳에 문자열을 넣는 소스이다. 뭐 더 설명할 것이 없다. back_inserter 를 사용했고, copy 를 사용했다.
istream_iterator 는 "입력 스트림 이터레이터" 라고 하는데, 입력 스트림을 읽어 첫번째 템플릿 매개변수 형식에 맞추어 값을 저장하는데, 위의 코드에선 string에 대입(임시객체라 봐도 될 듯)시켜 준다. 사실 템플릿 매개변수는 총 4가지 인데, 나머지 3가지는 디폴트가 있기 때문에, 위에 처럼 써도 된다.
입력 스트림 이터레이터의 생성자는 입력 스트림 객체를 인수로 받는데, std::cin 이 그것이다. 입력 스트림 인터레이터는 operator++ 로 다음 입력 스트림을 받을 수 있다. 이 때, 그 전에 받아 두었던 객체가 있다면 날라간다. 위에선 string 이 날라간다.
더 자세한 것은 다른 곳을 찾아 보는게 좋을 듯 하다. (구글링 : istream_iterator)
본론으로 돌아와서, 코드의 문제점을 지적해 본다면(문제점까지는 아니지만), copy 함수에 3개의 매개변수 전부를 그 함수의 실행코드 안에 넣게 되면, 아무래도 가독성이나, 버그(.. 이것 역시 찾아보면 많이 나오니 생략)등 예기치 않은 문제가 있을 수 있으니 객체를 copy 함수 위에서 생성하고 쓰는게 좋다.
이 문제점은 다은 링크와 같은 취지에 있다. : http://ikpil.com/720
2 ) 다음 코드는 무엇인가?
15 라인, deque의 생성자를 호출하여 생성하는데, 두개의 이터레이터를 받아서 생성하는 것이다. 이 두개의 이터레이터는 범위를 나타내는 것이기 때문에, 그 범위 안에 있는 모든 원소들을 복사한 deque가 만들어 진다.
17 라인, 이번 항목에서 제일 중요하게 생각하는 부분이다. 15라인 처럼, 두개의 입력스트림 이터레이터를 받아 들이어, 그 범위 안에 있는 모든 원소들을 복사하여, 생성자를 호출 한다.
.. 로 정리하면 당신은 함정에 빠진 것이다. 왜냐하면 저 위의 정의는 함수 선언이기 때문이다.
여담
웃기게도 Dev C++ 컴파일러에서는 .. 잘 컴파일 된다. 저게 어떻게 되는지 도통 모르겠다.(아시는 분은 좀 알려 주세요...)
저 위의 코드만 보면, 많이 헷갈리니, 좀 간략한 코드를 보자.
자, f는 int 형을 반환하고 void 형을 매개변수를 받는 함수를 매개변수로 하는 함수이다. 말로 표현하니 참 힘들다. f를 다음과 같이 쓸수 있는데, 한번 보자.
.. f는 무엇일까?
함수의 정의 표현식은 매개변수의 이름을 생략 할 수 있다. 그러므로 엄연히 f는 함수다. .. 그것도 위와 동일한 함수이다.
본론으로 돌아와서 이건 뭘까?
.. 함수다. 그것도 매우 보기 힘든 함수...
3 ) 코드가 프로그래머의 원래 의도대로 작동하게 하려면 어떻게 고쳐야 하는가?
.. 이렇게 고치면 된다.
총평
이런 부분은 조심해야 된다.
'책 정리 > Exceptional C++ Style' 카테고리의 다른 글
항목 34 : 색인 테이블 ( 난이도 : 5 ) (0) | 2009.02.01 |
---|---|
항목 33 : 연산자 놀이 ( 난이도 : 4 ) (0) | 2009.02.01 |
항목 32 : 오타 또는 C++의 생소한 표기법 (0) | 2009.01.26 |
항목 31 : 이상한 코드 ( 난이도 : 4 ) (2) | 2009.01.26 |
항목 30 : double 과 float ( 난이도 : 4 ) (0) | 2009.01.26 |
항목 28 : 키워드의 비밀 ( 난이도 : 3 ) (0) | 2009.01.24 |
항목 27 : 자료 포맷과 효율성, 2부 : 비트 다루기 ( 난이도 : 8 ) (0) | 2009.01.24 |
항목 26 : 자료 포맷과 효율성, 1부 : 간결함 ( 난이도 : 4 ) (0) | 2009.01.24 |
항목 25 : inline 해부 ( 난이도 : 7 ) (0) | 2009.01.23 |
항목 24 : const 최적화 ( 난이도 : 3 ) (0) | 2009.01.23 |
최근댓글