<分区>
内部类重载和外部类重载有什么区别?
class A{
public:
bool operator==(const A *i){
....
....
}
};
对比
bool operator==(const A *i , const A *j){
....
....
}
<分区>
内部类重载和外部类重载有什么区别?
class A{
public:
bool operator==(const A *i){
....
....
}
};
对比
bool operator==(const A *i , const A *j){
....
....
}
最佳答案
首先考虑使用您的类(重新格式化为我喜欢的样式)的示例:
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.
}
关于c++ - 运算符在类内与类外重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41563571/