我想知道什麼樣的類成員訪問friend
函數和static
成員函數具有類對象。具體而言,差異是什麼以及爲什麼要使用這兩者之一。我的理解是,聲明爲friend
的函數或static
成員都可以訪問該類的任何實例的私有成員。朋友和靜態成員函數有什麼樣的成員訪問?
我會舉一個快速示例來說明爲什麼它們看起來和我很相似。 operator<
和MyClass::lessThan
這兩個函數似乎都具有相同的訪問權限,並且可以執行完全相同的操作。
class MyClass {
friend bool operator<(const MyClass &left, const MyClass &right);
public:
MyClass(int pub, int priv) : m_pub(pub), m_priv(priv) {}
static bool lessThan(const MyClass &left, const MyClass &right);
int m_pub;
private:
int m_priv;
};
bool operator<(const MyClass &left, const MyClass &right) {
return ((left.m_pub < right.m_pub) && (left.m_priv < right.m_priv));
}
bool MyClass::lessThan(const MyClass &left, const MyClass &right) {
return ((left.m_pub < right.m_pub) && (left.m_priv < right.m_priv));
}
int main(int argc, const char* argv[]) {
MyClass a(1, 2),
b(3, 4),
c(-1, 1);
cout << "a < b = " << (a<b) << endl;
cout << "a lessThan b = " << MyClass::lessThan(a,b) << endl;
cout << "a < c = " << (a<c) << endl;
cout << "a lessThan c = " << MyClass::lessThan(a,c) << endl;
}
顯然,這是一個簡單的例子,但我想我的問題是由兩部分組成:
- 什麼是關於成員訪問的朋友和靜態函數之間的區別是什麼?
- 什麼樣的事情應該考慮在決定使用哪一種?
「朋友」的重點是給其他功能/類私人訪問。至於使用哪個,靜態函數不能訪問實例成員。他們的本意就是你可以在沒有物體的情況下打電話。 – chris
另外:'operator <(a,b)'編譯,而'lessThan(a,c)'不。 –
chris - 謝謝,這是我忘記的一個重要區別。然而,像這裏給出的例子那樣,靜態函數可以訪問實例成員,因爲實例被作爲參數傳遞了嗎? – Ayelix