内部操作符与外部类重载
这个问题在这里已经有了答案:
首先考虑使用你的类的这个例子(重新格式化我喜欢的风格):
class A
{
public:
auto operator==( A const* p )
-> bool
{
return true; // Whatever.
}
};
auto main()
-> int
{
A u{}, v{};
A const c{};
bool const r1 = (u == &v); // OK but needlessly annoying.
bool const r2 = (c == &v); // !Will not compile.
}
这里
&
。 const
,因此不能比较为const
对象。 因此,传统的做法是通过引用传递参数,并使方法为const
:
class B
{
public:
auto operator==( B const& o ) const
-> bool
{
return true; // Whatever.
}
};
auto main()
-> int
{
B u{}, v{};
B const c{};
bool const r1 = (u == v); // OK.
bool const r2 = (c == v); // OK.
}
如果你在类之外定义比较,如下所示:
class B
{};
auto operator==( B const& u, B const& v )
-> bool
{
return true; // Whatever.
}
auto main()
-> int
{
B u{}, v{};
B const c{};
bool const r1 = (u == v); // OK.
bool const r2 = (c == v); // OK.
}
… 然后
B
类的内部实现细节,这在未来可能会改变。 B
的值。 auto operator==( int const u, B const& v )
-> bool
{
return true; // Whatever.
}
如果您选择通过friend
机制将这些非成员运算符内联放置在类定义内部(以便通过ADL查找找到它们),那么您将失去第一个子句点的优势,但是然后您将所有代码与在类定义中使用类:
class B
{
public:
friend
auto operator==( B const& u, B const& v )
-> bool
{
return true; // Whatever.
}
friend
auto operator==( int const u, B const& v )
-> bool
{
return true; // Whatever.
}
};
auto main()
-> int
{
B u{}, v{};
B const c{};
bool const r1 = (u == v); // OK.
bool const r2 = (c == v); // OK.
bool const r3 = (42 == v); // OK.
}
链接地址: http://www.djcxy.com/p/12715.html