본문 바로가기

Information Technology/C++

[C++] 단항 연산자 오버로딩

이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요 ;)

 


int a = 10;
cout << -a << endl;

bool k = true;
cout << !k << endl;

+, -,!처럼 하나의 변수 앞에 붙어 특정 연산을 하는 연산자를 단항 연산자라고 합니다. 이런 단항 연산자들 역시 기존 자료형에서는 문제없이 작동되지만 사용자 정의 자료형인 클래스에서는 따로 정의를 해줘야 합니다. 

class Cents
{
private:
	int m_cents;

public:
	Cents(int cents = 0) { m_cents = cents; }

	Cents operator - () const
	{
		return Cents(-m_cents);
	}

	bool operator! () const
	{
		return (m_cents == 0) ? true : false;
	}

	friend std::ostream& operator << (std::ostream& out, const Cents& c)
	{
		out << c.m_cents;
		return out;
	}
};

예제로 사용된 Cents 클래스의 전체 정의 부분입니다.

우선 단항 연산자 중 - 연산자부터 보겠습니다.

Cents operator - () const
{
	return Cents(-m_cents);
}

- 연산자 정의는 입출력 연산자나 산술 연산자에 비해 간단합니다. Cents를 출력 자료형으로 입력하고, 연산자 이름에 operator -를  그리고 매개변수는 입력하지 않습니다.

return값에는 코드 블록과 같이 Cents(-m_cents)를 입력하면 됩니다.

int main()
{
	Cents cents1(6);

	cout << cents1 << endl;
	cout << -cents1 << endl;
	cout << -Cents(-10) << endl;

	return 0;
}

그리고 main 함수에서 코드 블록과 같이 Cents 자료형 cents1을 정의하고, cents1에 그대로 - 연산자를 붙여 출력하면

사진과 같이 아무 이상 없이 출력되는 걸 확인할 수 있습니다.

주의하실점은 Cents 클래스의 멤버들을 정의할 때 출력 연산자의 매개변수에서 Cents& c 앞에 선언하는 const를 없애면 일반 출력은 가능하지만, - 연산자를 붙인 cents1은 출력할 수 없다고 나옵니다. 혹시 그 이유를 아는 분은 댓글로 남겨주세요ㅠ

 

bool operator! () const
{
	return (m_cents == 0) ? true : false;
}

이번에는 !(not) 연산자입니다. ! 연산자는 - 연산자와 다르게 출력 값이 true 아니면 false인 boolean 자료형으로 출력될 수밖에 없어요. 때문에 출력 연산자는 bool로 설정해줍니다. 그리고 연산자 이름에는 operator! 를 입력해주고 매개변수는 없습니다.

return 값은 클래스 내에서 ! 연산자를 어떤 용도로 사용하느냐에 따라 그 정의가 달라집니다. 이번 예제에서는 단순히 Cents의 멤버인 m_cents가 0이면 true를, 0이 아니면 false를 출력하도록 정의했습니다.

int main()
{
	Cents cents1(6);
	Cents cents2(0);

	cout << !cents1 << " " << !cents2 << endl;
	return 0;
}

이렇게 정의한 Cents 클래스를 main함수에서 다음과 같이 실행시키면

cents1은 0이 아니기 때문에 0이 출력되고, cents2는 0이기 때문에 1이 출력되는 걸 확인할 수 있습니다!

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

[C++] 비교 연산자 오버로딩  (0) 2019.11.17
[C++] 클래스와 const  (0) 2019.11.16
[C++] 입출력 연산자 오버로딩  (0) 2019.11.15
[C++] 산술 연산자 오버로딩  (0) 2019.11.15
[C++] std::move(2)  (0) 2019.11.15