이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 주의하고 읽어주세요 ;)
이번에는 사용자 정의 자료형의 비교 연산자에 대해 알아보겠습니다.
#include <iostream>
using namespace std;
class Cents
{
private:
int m_cents;
public:
Cents(int cents = 0) { m_cents = cents; }
int getCents() const { return m_cents; }
int& getCents() { return m_cents; }
friend std::ostream& operator << (std::ostream& out, const Cents& c)
{
out << c.m_cents;
return out;
}
};
int main()
{
Cents cents1(6);
Cents cents2(6);
if (cents1 == cents2)
cout << "Equal" << endl; //error!
return 0;
}
전체 코드는 다음과 같습니다. Cents 클래스를 정의할 때 출력 연산자만 정의하고 비교 연산자를 설정하지 않을 경우,
main함수에서 Cents 자료형의 인스턴스들을 직접 비교하려고 하면 에러가 발생하게 됩니다.
이를 해결하기 위한 방법은 아래의 코드와 같습니다.
friend bool operator ==(const Cents&c1, const Cents&c2 )
{
return c1.m_cents == c2.m_cents;
}
friend bool operator !=(const Cents& c1, const Cents& c2)
{
return c1.m_cents != c2.m_cents;
}
클래스 내부에 위의 코드 블록과 같이 == 연산자와 != 연산자를 정의하면 됩니다.
출력 자료형은 true 아니면 false 중 한 가지 값만 나타내는 bool, 매개변수는 비교할 Cents자료형의 인스턴스를 변경할 수 없게 const를 선언한 레퍼런스로 가져옵니다.
연산자의 바디에는 두 인스턴스의 멤버가 같을 때와 다를 때의 비교 결과를 각각 리턴해주면 됩니다!
이번에는 예제를 조금 바꿔보았습니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Cents
{
private:
int m_cents;
public:
Cents(int cents = 0) { m_cents = cents; }
friend bool operator <(const Cents&c1, const Cents&c2 )
{
return c1.m_cents < c2.m_cents;
}
friend std::ostream& operator << (std::ostream& out, const Cents& c)
{
out << c.m_cents;
return out;
}
};
vector로 배열을 만들어서 이를 순서대로 정렬하는 sort에서 비교 연산자가 사용되는 과정을 확인할 건데요,
이를 위해 우선 헤더에서 vector와 algorithm을 추가했습니다.
그리고 Cents함수의 멤버에서 < 비교 연산자를 추가했습니다.
연산자를 추가하는 방법은 다른 연산자들과 비슷하게 리턴타입은 큰지 작은지를 true와 false로 말해줄 bool 자료형, 매개변수에는 비교를 할 Cents 자료형 인스턴스를 const 선언 후 레퍼런스로 가져옵니다.
주의하실점은 sort 알고리즘을 사용하려면 비교연산자 중 more than(>) 연산자가 아니라 less than(<)연산자를 사용해야만 sort 알고리즘을 사용할 수 있다고 합니다. 부등호의 왼쪽에 있는 걸 대상으로 하는 걸 생각해주세요!
'Information Technology > C++' 카테고리의 다른 글
[C++] 첨자 연산자 오버로딩 (0) | 2019.11.17 |
---|---|
[C++] 증감 연산자 오버로딩 (0) | 2019.11.17 |
[C++] 클래스와 const (0) | 2019.11.16 |
[C++] 단항 연산자 오버로딩 (0) | 2019.11.16 |
[C++] 입출력 연산자 오버로딩 (0) | 2019.11.15 |