++ 연사자와 -- 연산자는 피연산자의 위치에 따라서 의미가 달라진다.


# 연산자 오버로딩에서 ++ 연산자와 -- 연산자는 전위연산에 해당할까 후위연산에 해당할까?

=> 오버로딩 한 연산자를 호출하는 형태만 봐도, 전위증가, 전위감소 연산에 해당한다는 사실을 알 수 있다.


그렇다면, 후위증가, 후위감소 연산에 대한 연산자 오버로딩은 어떻게 해야 할까?

=> C++ 에서는 전위 및 후위 연산에 대한 해석방식에 대해 다음의 규칙을 정해놓고 있다. 


++pos                    ->                    pos.operator++();

pos++                    ->                    pos.operator++(int);


--pos                    ->                    pos.operator--();

pos--                    ->                    pos.operator--(int);


즉, 키워드 int 를 이용해서 후위연산에 대한 함수를 전위연산에 대한 함수와 구분하고 있다. 물론 여기서 사용된 int는 단지 후위연산을 구분하기 위한 목적으로 선택된 것일 뿐!! 아무 상관 없다.



#include <iostream>

using namespace std;


class Point

{

private:

int xpos, ypos;


public:

Point(int x = 0, int y = 0)

:xpos(x), ypos(y)

{ }


void Show() const

{

cout<<xpos<<", "<<ypos<<endl;

}


Point& operator++() //선위증가

{

xpos+=1;

ypos+=1;


return *this;

}


const Point operator++(int) //후위증가

{

const Point retObj(*this); //디폴트 복사생성자로 인해 멤버 대 멤버로 복사진행.

xpos+=1;

ypos+=1;


return retObj;

}


friend Point& operator--(Point &);

friend const Point operator--(Point &, int);

};


Point& operator--(Point &ref) //선위감소

{

ref.xpos-=1;

ref.ypos-=1;

return ref;

}


const Point operator--(Point &ref, int) //후위감소

{

const Point retObj(ref);

ref.xpos-=1;

ref.ypos-=1;


return retObj;

}


int main(void)

{

Point pos(5, 5);

++pos;


pos.Show();

--pos;

pos.Show();


(--(--pos)).Show();


Point cpy = pos++;

cpy.Show();

pos.Show();


cpy = pos--; //operator--(pos);

cpy.Show();

pos.Show();


// (cpy++)++; //컴파일 에러

return 0;

}





반환형에서의 const 선언과 const 객체


const Point retObj(*this);        //함수 내에서 retObj 의 변경을 막겠다라는 뜻!


# 반황형으로 선언된 const는 어떠한 의미를 지닐까?


=> operator-- 함수의 반환으로 인해서 생성되는 임시객체를 const 객체로 생성하겠다. 라는 의미가 된다.


ex) const Point pos(3, 4);

# pos 객체를 상수화해서 pos 객체에 저장된 값의 변경을 허용하지 않겠다는 뜻이다. 그래서 const객체인 pos를 대상으로는 const로 선언된 함수만 호출이 가능하다.

(( const 함수 내에서는 const 함수의 호출만 허용하도록 제한한다 )) => 즉, const 객체를 대상으로는 값의 변경능력을 지니는, const로 선언되지 않은 함수의 호출을 허용하지 않겠다는 뜻이다. 



 - 결론

# 이 예제에서 반환형으로 const를 선언한 이유!!!


=> 후위증가, 감소 연산은 전위증가, 감소와는 다르게 같은 라인에 2번이상 못쓴다. 이것이 C, C++의 연산 특성이다. 

그래서 이 특성을 그대로 반영하기 위하여 반환형에 const를 넣어준 것이다. 컴파일 에러가 발생할 수 있도록!!!

'Programming > C++' 카테고리의 다른 글

cout, cin 그리고 endl의 정체  (0) 2012.08.30
교환법칙 문제의 해결  (0) 2012.08.28
단항 연산자의 오버로딩  (0) 2012.08.27
연산자 오버로딩 (Operator Overloading)  (0) 2012.08.25
가상 상속 (Virtual Inheritance)  (0) 2012.08.22
Posted by scii
: