我想知道类对象有什么样的类成员访问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;
}
显然这是一个简化的例子,但我想我的问题分为两部分:
- 在成员访问方面,朋友和静态函数有什么区别?
- 在决定使用哪一种时应该考虑哪些事情?