전위증가와 후위증가의 구분
Programming/C++ 2012. 8. 27. 15:42 |++ 연사자와 -- 연산자는 피연산자의 위치에 따라서 의미가 달라진다.
# 연산자 오버로딩에서 ++ 연산자와 -- 연산자는 전위연산에 해당할까 후위연산에 해당할까?
=> 오버로딩 한 연산자를 호출하는 형태만 봐도, 전위증가, 전위감소 연산에 해당한다는 사실을 알 수 있다.
그렇다면, 후위증가, 후위감소 연산에 대한 연산자 오버로딩은 어떻게 해야 할까?
=> 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 |