본문 바로가기

C++/C++ 문법

[C++] 단항 연산자 오버로딩 (전위, 후위 연산자 오버로딩)

728x90
반응형

단항 연산자 오버로딩

 

단항 연산자를 오버로딩할 때에는 피연산자가 2개 이상인 연산자의 오버로딩과 차이점이 존재한다.

 

단항 연산자의 경우는 아래 코드처럼 반환값을 자기 자신으로 해주어야 한다.

 

class Pos {
private:
	int x;
	int y;
public:
	Pos(int x1 = 0, int y1 = 0) : x(x1), y(y1) { }
	Pos& operator++() {
		x+=1;
		y+=1;
		return *this;
	}
};

 

 

 

단항 연산자 오버로딩의 사용

 

단항 연산자를 오버로딩하여 사용하는 방법은 아래와 같다.

 

	Pos pos1(10, 15);
	Pos pos2(5, 7);
	pos1.operator++();
	++pos2;

 

 

 

 

이때 아래와 같은 코드의 사용도 가능하다.

 

	Pos pos1(10, 15);
	++(++pos1);

 

오버로딩된 연산자가 객체를 반환하기 때문에 위와 같은 코드도 가능한 것이다.

 

 

 

 

 

전역함수에 의한 단항 연산자 오버로딩

 

단항 연산자도 아래 코드처럼 전역함수를 사용하여 오버로딩할 수 있다.

 

class Pos {
private:
	int x;
	int y;
public:
	Pos(int x1 = 0, int y1 = 0) : x(x1), y(y1) { }
	friend Pos& operator++(Pos& pos);
};
Pos& operator++(Pos& pos)
{
	pos.x+=1;
	pos.y+=1;
	return pos;
}

 

 

 

 

 

 

 

전역함수에 의한 단항연산자 오버로딩의 사용

 

전역함수로 오버로딩한 단항연산자는 아래 코드와 같이 사용할 수 있다.

 

	Pos pos1(10, 15);
	Pos pos2(5, 7);
	++pos1;
	operator++(pos2);

 

 

 

 

 

 

 

 

 

 

후위 연산자 오버로딩

 

후위연산자를 오버로딩할 때에는 아래 코드와 같이 int 키워드를 사용한다.

 

Pos& operator++(int) { }

friend Pos& operator++(Pos& pos, int);

 

 

후위 연산의 경우 구현에도 차이점이 있다.

값의 증감 연산은 진행하되 전달하는 값은 연산이 진행되지 않은 값이어야 한다.

 

따라서 아래 코드처럼 구현하는 것이 가능하다.

 

class Pos {
private:
	int x;
	int y;
public:
	Pos(int x1 = 0, int y1 = 0) : x(x1), y(y1) { }
	Pos& operator++(int) {
		const Pos pos(x, y); // const Pos pos(*this);
		x += 1;
		y += 1;
		return pos;
	}
};

 

 

 

friend 선언을 통한 전역함수로 구현하는 코드는 아래와 같다.

 

class Pos {
private:
	int x;
	int y;
public:
	Pos(int x1 = 0, int y1 = 0) : x(x1), y(y1) { }
	friend Pos& operator++(Pos& pos, int);
};
Pos& operator++(Pos& pos, int)
{
	pos.x += 1;
	pos.y += 1;
	return pos;
}

 

 

 

 

 

 

 

728x90
반응형