我想知道什么样的类(class)成员访问friend
功能和static
成员函数用于类对象。具体来说,有什么区别以及为什么要使用其中一种。据我了解,函数声明为 friend
一个类或作为 static
成员都可以访问该类的任何实例的私有(private)成员。
我将举一个简单的例子来说明为什么他们看起来与我如此相似。两个功能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;
}
显然这是一个简化的示例,但我想我的问题分为两部分:
- 在成员访问方面,友元函数和静态函数有何区别?
- 在决定使用哪个时应考虑哪些因素?
最佳答案
请记住,虽然 friend 函数的原型(prototype)出现在类定义中,但 friend 函数不是函数成员。类的 friend 函数是在类之外定义的,但 friend 函数可以访问非公共(public)成员。有些人认为“友元”会破坏信息隐藏。有时friend函数被用来创建测试器类。
当对象类应该共享变量的唯一拷贝时,使用静态数据成员。因此,当所有类成员只需一份拷贝就足够时,您必须使用静态数据成员来节省存储空间。
对于静态成员函数,您可以查看以下内容:When to use static member function?
关于c++ - 友元和静态成员函数有哪些类型的成员访问权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12379525/