LANG/C++

[C++]10-2.단항 연산자의 오버로딩

혀니리리 2023. 5. 18. 13:31
728x90

닪ㅇ 연산자와 이항 연산자의 가장 큰 차이는 피연산자의 개수

 

증가 연산자 ++

감소 연산자 --

++pos => 멤버함수로 오버로딩 된 경우: pos.operator++();

                전역함수로 오버로딩 된 경우: operator++(pos);

 

#include <iostream>
using namespace std;

class Point
{
private:
	int xpos, ypos;
public:
	Point(int x = 0, int y = 0):xpos(x), ypos(y)
    {}
    void ShowPosition() const
    {
    	cout << '[' << xpos << ", " <<ypos << ']' << endl;
    }
    Point& operator++()
    {
    	xpos += 1;
        ypos += 1;
        return *this;
    }
    friend Point & operator--(Point &ref);
}

Point& operator--(Point &ref)
{
	ref.xpos -= 1;
    ref.ypos -= 1;
    return ref;
}

int main(void)
{
	Point pos(1, 2);
    ++pos;
    pos.ShowPosition();
    --pos;
    pos.ShowPosition();
    
    ++(++pos); //++연산자는 멤버함수의 형태로 오버로딩 되었으므로, 이 문장은 pos.operator++();으로 해석됨
    pos.ShowPosition();
    --(--pos); //--연산자는 전역함수의 형태로 오버로딩 되었으므로, 이 문장은 operator--(pos);으로 해석됨
    pos.ShowPosition();
    return 0;
}

결과)

[2, 3]

[1, 2]

[3, 4]

[1, 2]

 

전위증가와 후위증가의 구분

다음과 같이 규칙을 정해놓고 있음

++pos => pos.operator++(); //전위

pos++ => pos.operator++(int); //후위

 

--pos -> pos.operator--(); //전위

pos-- -> pos.operator--(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 ShowPosition() const
    {
    	cout << '[' << xpos << ", " <<ypos << ']' << endl;
    }
    Point& operator++()//전위증가
    {
    	xpos += 1;
        ypos += 1;
        return *this;
    }
    const Point& operator++(int)//후위증가
    {
    	const Point retobj(xpos, ypos); //함수 내에서 retobj의 변경을 막겠다!
    	xpos += 1;
        ypos += 1;
        return retobj;
    }
    friend Point & operator--(Point &ref);
    friend const Point & operator--(Point &ref, int);
}

Point& operator--(Point &ref)//전위감소
{
	ref.xpos -= 1;
    ref.ypos -= 1;
    return ref;
}

Point& operator--(Point &ref, int)//후위감소
{
	const Point retobj(ref); //함수 내에서 retobj의 변경을 막겠다!
	ref.xpos -= 1;
    ref.ypos -= 1;
    return ref;
}

int main(void)
{
	Point pos(3, 5);
    Point cpy;
    cpy = pos--;
    cpy.ShowPosition();
    pos.ShowPosition();
    
    cpy = pos++;
    cpy.ShowPosition();
    pos.ShowPosition();
    return 0;
}

 

후위연산에는 const가 붙으므로 (num++)++; 같은 경우 컴파일 ERROR!

728x90