代码之家  ›  专栏  ›  技术社区  ›  Ayelix

朋友和静态成员函数有什么样的成员访问权限?

  •  2
  • Ayelix  · 技术社区  · 12 年前

    我想知道什么样的类成员访问 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;
    }
    

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

    1. 在成员访问方面,朋友函数和静态函数之间有什么区别?
    2. 在决定使用哪一种时,应该考虑哪些因素?
    5 回复  |  直到 12 年前
        1
  •  2
  •   Community CDub    7 年前

    请记住,尽管 朋友 函数出现在类定义中, 朋友 函数不是函数成员。A. 朋友 类的函数是在类之外定义的,但是 朋友 该功能已允许非公共成员访问。有些人认为“友谊”会破坏信息的隐藏。有时 朋友 函数用于生成测试程序类。

    当对象类应该只共享变量的一个副本时,将使用静态数据成员。因此,当所有类成员只需要一个副本就足够了时,必须使用静态数据成员来保存存储。

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

        2
  •  1
  •   Sergey Kalinichenko    12 年前
    1. 他们都可以接触到班上的所有成员,包括私人成员
    2. 您需要决定一个函数在逻辑上是否属于它需要访问其成员的类,或者它是否属于另一个类,或者根本不属于任何类。在第一种情况下(逻辑上属于类的函数),使函数成为静态的;在第二种情况下,将其作为朋友,并根据您的设计将其添加到类或其逻辑上所属的命名空间中。
        3
  •  1
  •   André Oriani    12 年前

    它们是不同的概念:

    如果一个类、方法或函数是类X的朋友,则该类、函数或方法可以访问被声明为私有的类X的成员,因此通常不能在类外部访问

    class A{
      private:
         int x;
      friend void foo(A& a);
    
    };
    
    void foo(A& a){
        a.x = 3; //Access okay, foo is a friend of A
    } 
    
    void bar(A& a){
       a.x = -1; // Compiler will complain A::x is private
    }
    

    静态成员是在该类的所有对象实例之间共享的数据成员,或者是可以在没有该类的实例对象的情况下调用的方法。

    class B{
    
      private:
        static int y;
    
      public:
        static void printY();
        void alterY();
    
    }
    
    int B::y=3;
    
    void B::printY(){
       cout<<y;
    }
    
    void B::alterY(){
       y++;
       cout<<y;
    }
    
    
    B b1,b2;
    B::printY();// will output 3
    b1.alterY();// will output 4
    b2.alterY();// will output 5
    
        4
  •  1
  •   Borgleader    12 年前

    静态方法可以在不经过类实例的情况下调用,因此它们没有任何直接访问权限,它们类似于全局函数,但嵌套在类的命名空间中。但是,如果您给它们一个该类的实例作为参数,它们将能够访问成员变量,而无需像非静态方法一样通过访问器。像静态方法一样,friend函数如果您给它们一个类的实例作为参数,它们将能够直接访问成员变量。

        5
  •  0
  •   Loki Astari    12 年前

    在成员访问方面,朋友函数和静态函数之间有什么区别?

    没有一个他们都有完全的访问权。

    在决定使用哪一种时,应该考虑哪些因素?

    它完全取决于上下文以及什么使代码更容易阅读。

    在你上面的例子中,我当然更喜欢 bool operator<() 结束 MyClass::lessThan() 因为它使代码的阅读更加直观。