c++ 비교 연산자 오버로딩 하기
728x90
#include <iostream> #include <vector> #include <algorithm> 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& cents) { out << cents.m_cents; return out; } }; int main() { return 0; }
앞전에 쓰던 Cents class를 그대로 가져왔습니다.
int main() { Cents cents1(6); cout << cents1 << endl; return 0; }

요기서 의문이 듭니다 출력을 오버 로딩하였기 때문에 정수로 출력되는데 == ,!= 같은 비교 연산자를 바로 사용할 수 없을까?
int main() { Cents cents1(6); cout << cents1 << endl; cout << typeid(cents1).name() << endl; return 0; }

type을 찍어보면 출력을 오버 로딩했을 뿐 정수형이 아닌 class 형입니다.
비교 연산자를 사용하려고 하면 operator 오버 로딩이 필요합니다.
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 bool operator == (const Cents &lhs, const Cents &rhs) { return lhs.m_cents == rhs.m_cents; } friend std::ostream& operator << (std::ostream& out, const Cents& cents) { out << cents.m_cents; return out; } };
class 안에서 friend를 사용하였고 비교 연산자는 true flase를 return 하기 때문에 bool type으로 지정합니다.
좌변(left hand side)과 우변(right hand side)을 파라미터로 받아 비교하고 return 합니다.
int main() { Cents cents1(6); Cents cents2(7); if (cents1 == cents2) cout << "Equal" << endl; else cout << "Not Equal" << endl; return 0; }

비교 연산자를 이용해 cents를 배열로 만든 뒤 sort함수를 사용해 정렬해보겠습니다.
#include <iostream> #include <vector> #include <algorithm> int main() { vector<Cents> arr(20); for (unsigned int i = 0; i < 20; ++i) arr[i].getCents() = i; random_shuffle(begin(arr), end(arr)); for (const auto& e : arr) cout << e << " "; cout << endl; return 0; }
20개의 정수를 담을 수 있는 배열을 만든 뒤 반복문으로 0 ~ 19까지 배열에 추가합니다.
random shuffle 함수를 사용해 무작위로 배열을 섞습니다.
sort(begin(arr), end(arr));
요기서 sort 함수를 사용하면 에러를 발생시킵니다 sort함수는 class 안의 정수를 읽을 수 없습니다.
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 bool operator < (const Cents &c1, const Cents &c2) { return c1.m_cents < c2.m_cents; } friend std::ostream& operator << (std::ostream& out, const Cents& cents) { out << cents.m_cents; return out; } };
sort 함수에 사용할 연산자 오버 로딩을 할 때는 우변이 더 크냐 라는 연산자를 오버 로딩에서 구현해야 합니다.
좌변이 더 크냐 >를 사용 할시 컴파일 에러가 발생합니다.
#include <iostream> #include <vector> #include <algorithm> 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; } Cents operator - () const { return Cents(-m_cents); } bool operator ! () const { return (m_cents == 0) ? true : false; } friend bool operator < (const Cents &c1, const Cents &c2) { return c1.m_cents < c2.m_cents; } friend bool operator == (const Cents &lhs, const Cents &rhs) { return lhs.m_cents == rhs.m_cents; } friend std::ostream& operator << (std::ostream& out, const Cents& cents) { out << cents.m_cents; return out; } }; int main() { vector<Cents> arr(20); for (unsigned int i = 0; i < 20; ++i) arr[i].getCents() = i; random_shuffle(begin(arr), end(arr)); for (const auto& e : arr) cout << e << " "; cout << endl; sort(begin(arr), end(arr)); for (const auto& e : arr) cout << e << " "; cout << endl; return 0; }

728x90
'C++ > c++ - 따라하며 배우는 c++' 카테고리의 다른 글
c++ 첨자연산자 오버로딩 (0) | 2020.11.12 |
---|---|
증감연산자 오버로딩 (0) | 2020.11.12 |
c++ 단항 연산자 오버로딩 하기 (0) | 2020.11.05 |
c++ 익명 객체 (anonymous) (0) | 2020.10.30 |
c++ 친구 함수와 클래스 friend (0) | 2020.10.30 |
댓글
이 글 공유하기
다른 글
-
c++ 첨자연산자 오버로딩
c++ 첨자연산자 오버로딩
2020.11.12 -
증감연산자 오버로딩
증감연산자 오버로딩
2020.11.12 -
c++ 단항 연산자 오버로딩 하기
c++ 단항 연산자 오버로딩 하기
2020.11.05 -
c++ 익명 객체 (anonymous)
c++ 익명 객체 (anonymous)
2020.10.30
댓글을 사용할 수 없습니다.