함수 매개변수를 후위증가 시키는것과 같은 간단한 코드 차이도 결과에 큰 영향을 미칠수 있다는 것을 보여 주는 항목이다. ... 바로 질문 넘어가자.

1. 다음 코드가 하는 일을 설명하라.

f의 경우

1. f가 함수 일 경우, 내부적으로 a의 타입에 맞는 복사 생성자가 호출되어, a와 똑같은 임시객체가 생성되고, 자신을 증가시킨 후, 임시객체를 a++ 자리에 올려 두고 f()에 전달한다. 또한 표준에 의하여, 임시객체를 non-const 로 받을수 없기 때문에 f는 const reference나 복사 생성자를 이용하여 전달해야만 할 것이다.

2. f가 매크로 함수(#define 함수)라면, 경우에 따라서 a가 여러번 호출 될 수 있다는 점이다.

3. f가 객체라면, 1번과 마찬가지

4. f가 typename 일 경우, 1번과 마찬가지.

a의 경우

1. a가 매크라라면 a역시 어떤 의미든 부여하는 대로 움직인다.

2. a가 객체인 경우, 임시객체를 리턴하고 자기 자신을 증가 시킬 것이다.

3. a가 주소인 경우, .. a의 주소 한칸을 앞으로 전진 시킨다.


2. 다음 두개의 코드 사이에 차이가 있는가? 있다면 무슨 차이가 있나?

차이는 후자가 한번 더 임시객체를 만들 수 있는 건덕지를 준다는데에 있다. 좋은 점은, 후자의 경우, f() 에서 예외가 발생했을 경우, a의 operator++(int) 가 발생되지 않기 때문에 "a를 보존할 수 있다."


3. 문제 2에서 f()가 참조가 아닌 값으로 매개변수를 받고, a는 operator++(int)를 가지고 클래스 타입 객체라고 가정하자. 이때 문제2에서 어떤 차이가 있고, 무엇인가?

만약에 a가 이터레이터이거나 어떤 특정 객체라고 했을 경우에, 문제가 생길수도 있고 안생길수도 있다. 한가지 반드시 짚고 넘어가야 하는것이 후위연산과 전위연산의 차이점을 명확히 알아두어야 한다는 것이다.


총평

이번 항목은 전위연산과 후위연산에 대해서 무엇을 생각해 봐야 하는지 지적되었던 항목이였던 것 같다.


신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요