왜 전위 연산을 하는 버릇을 들이라고 했을까?
int i = 0;
++i;//⭐
i++//❗두 가지 모두 +1이 저장되는 것은 맞을텐데 말이다.
내부 동작을 살펴보자.
전위연산
전위 연산은 선 연산, 후 대입이다. 즉, 우선 1을 더한 후 (연산) 더해진 값을 반환하는 것이다.(대입)
그렇기에 내부적으로 보면 다음과 같이 진행이 된다. (만약 연산자 오버로딩을 한다고 했을 때)
class Test{
public:
Test(int i) : m_i(i){} // 생성자
Test& operator++(){
m_i += 1;
return m_i;
}
private:
int m_i;
}전위 연산자의 경우에는 자신의 내부 값에 +1 을 한 후에 자기 자신을 그대로 return하게 된다. 이때, 레퍼런스 타입으로 반환이 되기 때문에
int i = 0;
++(++i);위와 같은 문법이 허용이 되는 것.
반면에
후위연산
후위 연산은 아래와 같이 구현이 되어 있다.
class Test{
public :
Test(int i) : m_i(i){}
Test operator++(int){
Test Tmp(*this);
m_i +=1;
return Tmp;
}
private:
int m_i;
}즉, 레퍼런스가 아니 R_value를 반환하기에 전위연산과 다르게
(i++)++;와 같은 문법은 불가능할 뿐만 아니라, Test Tmp(*this);와 같이 임시 객체를 하나 더 만들어야 하기 때문에,
전위/후위의 구분이 크게 필요 없는 작업이라면 후위연산보다는 전위연산이 상대적으로 효율적이다.