gpt4 book ai didi

c++ - 为什么 operator< 应该是非成员函数?

转载 作者:太空宇宙 更新时间:2023-11-04 14:50:16 25 4
gpt4 key购买 nike

我记得 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 < zero) 和 (zero < x) 都有效! (long double 是否转换为 Float ?)

但是 (zero < y) 不是,因为 zero 不是 Float .

你看,在第一种情况下,member function花费更少的代码长度,在第二种情况下,non-member function使比较更容易。所以我想知道

  • 在第一种情况下,我应该使用 member function 吗?而不是 non-member function
  • 为什么 C++ Primer建议 binary operatornon-member function
  • 还有其他情况member functionnon-member function有所作为?

感谢您的帮助!

最佳答案

我认为基本的答案是非成员函数在隐式转换中表现更好。因此,如果您可以将二元运算符编写为非成员函数,那么您应该这样做。

关于c++ - 为什么 operator< 应该是非成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12047174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com