1
內部和外部類重載有什麼區別?運營商內部vs外部重載
class A{
public:
bool operator==(const A *i){
....
....
}
};
VS
bool operator==(const A *i , const A *j){
....
....
}
內部和外部類重載有什麼區別?運營商內部vs外部重載
class A{
public:
bool operator==(const A *i){
....
....
}
};
VS
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查找找到它們)內聯在類定義中,然後失去了第一個bullet點的優勢,但是在類定義內部,所有代碼都與該類的使用相關:
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.
}
如果可以在室外進行,那麼在室外進行。但是,你爲什麼要比較一個指針?所以你想'obj1 ==&obj2'?沒有意義。 – DeiDei
嘗試使用任一。他們不做同樣的事情。 – juanchopanza