c++ - 友元和静态成员函数有哪些类型的成员访问权限?

标签 c++ static-methods friend static-members private-members

我想知道什么样的类(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;
}

显然这是一个简化的示例,但我想我的问题分为两部分:

  1. 在成员访问方面,友元函数和静态函数有何区别?
  2. 在决定使用哪个时应考虑哪些因素?

最佳答案

请记住,虽然 friend 函数的原型(prototype)出现在类定义中,但 friend 函数不是函数成员。类的 friend 函数是在类之外定义的,但 friend 函数可以访问非公共(public)成员。有些人认为“友元”会破坏信息隐藏。有时friend函数被用来创建测试器类。

当对象类应该共享变量的唯一拷贝时,使用静态数据成员。因此,当所有类成员只需一份拷贝就足够时,您必须使用静态数据成员来节省存储空间。

对于静态成员函数,您可以查看以下内容:When to use static member function?

关于c++ - 友元和静态成员函数有哪些类型的成员访问权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12379525/

相关文章:

c++ - 谁负责C++中的栈和堆?

c++ - 如何使用 Eigen 类型库创建静态成员变量

java - 类本身的静态方法?

c++ - VS2010 中的链接器错误(解决方案和静态方法中有 2 个项目)

c++ - 如何将模板函数声明为模板嵌套类的 friend ?

c++ - 如何通过使用友元函数来操作数据嵌套的私有(private)类

c++ - std::endl << std::flush 有目的吗?

C++ : namespace conflicting declaration error

c++ - 将数据读入队列

c++ - 无法调用 friend 类的构造函数