-2

我明白为什么静态函数不能访问非静态字段。但是如果我给他们发送一个类的对象,他们能访问他的私有字段吗?(不是静态的)

非常感谢。

4

4 回答 4

0

是的,每个成员函数都可以访问其类的私有成员(字段或方法),无论它们是否是静态的。

于 2013-02-13T09:31:10.550 回答
0

是的。例如:

class objType
{
    static void f(objType &obj);
    ...
    void f(objType &obj)
    {
        obj.somePrivateMember...
    }
};
于 2013-02-13T09:31:53.790 回答
0

是他们会。这是一个简短的示例:

#include <iostream>

using namespace std;

class A{
    public:
    A(): a(0) {}
    static void test(A& x) {
        x.a += 1;
    }
    private:
    int a;
};
int main() {
        A u;
    A::test(u);
        return 0;
}

ideone上编译。你真的应该学会自己尝试这些事情。

于 2013-02-13T09:32:07.663 回答
0

访问权限以及函数是否为静态是正交概念。成员函数可以访问所有成员,私有的、受保护的或公共的。不管它是否是静态的。然而,静态成员函数没有this指针,非静态成员需要一个对象才能被访问(甚至存在)。所以如果静态函数要访问非静态成员,就必须获取一个指针或者对另一个对象的引用(或者创建一个作为局部变量,但这真的很少见)。所以:

class Test
{
    int i;              //  Non-static member...
    static int si;      //  Static member...
public:
    static void func( Test* obj );
};

void
Test::func( Test* obj )
{
    si = 1;             //  No problem.
    i = 1;              //  Illegal, no instance.
    obj->i = 1;         //  No problem.
}

(显然,在像这样的微不足道的情况下,您只需将 static 放在func,并使用this而不是obj。但是可以想象其他获取指向静态函数中实例的指针的方法。)

于 2013-02-13T12:28:42.283 回答