私C++ Primer
は私たちにそうoperator<
あるべきだと言っていることを覚えていますnon-member function
、そして私は常に規則に従います。でも今はその理由を知りたいです。
私は次のコードを書きました:
#include <iostream>
using std::cout;
using std::endl;
struct Point1
{
int x, y;
Point1(const int a, const int b): x(a), y(b) { }
};
inline bool operator<(const Point1& lhs, const Point1& rhs)
{
return lhs.x < rhs.x || (lhs.x == rhs.x && lhs.y < rhs.y);
}
struct Point2
{
int x, y;
Point2(const int a, const int b): x(a), y(b) { }
bool operator<(const Point2& rhs)
{
return x < rhs.x || (x == rhs.x && y < rhs.y);
}
};
int main()
{
Point1 a(1, 2), b(1, 3);
cout << (a < b) << " " << (b < a) << endl;
Point2 c(2, 3), d(2, 4);
cout << (c < d) << " " << (d < c) << endl;
}
この場合、違いはなく、member
機能ははるかに単純なようです。
しかし、この場合:
#include <iostream>
using std::cout;
using std::endl;
// Usually I write it for comparing floats
class Float1
{
long double _value;
public:
static const long double EPS = 1e-8;
Float1(const long double value): _value(value) { }
const long double Get() const { return _value; }
};
inline bool operator<(const Float1& lhs, const Float1& rhs)
{
return rhs.Get() - lhs.Get() > Float1::EPS;
}
inline bool operator<(const Float1& lhs, const long double rhs)
{
return rhs - lhs.Get() > Float1::EPS;
}
class Float2
{
long double _value;
public:
static const long double EPS = 1e-8;
Float2(const long double value): _value(value) { }
const long double Get() const { return _value; }
bool operator<(const Float2& rhs)
{
return rhs._value - _value > Float2::EPS;
}
bool operator<(const long double rhs)
{
return rhs - _value > Float2::EPS;
}
};
int main()
{
Float1 x(3.14);
Float2 y(2.17);
long double zero = .0;
cout << (x < zero) << " " << (zero < x) << endl;
//cout << (y < zero) << " " << (zero < y) << endl; Compile Error!
}
(x <ゼロ)と(ゼロ<x)の両方が機能します!(?にlong double
変換されFloat
ます)
ただし、ゼロは。ではないため、(ゼロ<y)はそうではありませんFloat
。
最初のケースでは、member function
コードの長さが短くなり、2番目のケースでnon-member function
は比較が容易になります。だから知りたい
- 最初のケースでは、
member function
代わりに使用する必要がありnon-member function
ますか? - なぜ
C++ Primer
提案するbinary operator
のnon-member function
ですか? member function
他に違いを生むケースはありますnon-member function
か?
助けてくれてありがとう!