内部和外部类重载有什么区别?
getNumber()
VS
class A{
public:
bool operator==(const A *i){
....
....
}
};
答案 0 :(得分:3)
首先考虑使用您的类(重新格式化为我喜欢的样式)的示例:
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.
}