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