我明白为什么静态函数不能访问非静态字段。但是如果我给他们发送一个类的对象,他们能访问他的私有字段吗?(不是静态的)
非常感谢。
是的,每个成员函数都可以访问其类的私有成员(字段或方法),无论它们是否是静态的。
是的。例如:
class objType
{
static void f(objType &obj);
...
void f(objType &obj)
{
obj.somePrivateMember...
}
};
是他们会。这是一个简短的示例:
#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上编译。你真的应该学会自己尝试这些事情。
访问权限以及函数是否为静态是正交概念。成员函数可以访问所有成员,私有的、受保护的或公共的。不管它是否是静态的。然而,静态成员函数没有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
。但是可以想象其他获取指向静态函数中实例的指针的方法。)