c++中类的static成员函数如何使用类的非static成员变量?
展开全部
static成员函数,虽然是“成员”函数,但是他并不是真是成员,而是一个全局函数,只不过作用域受到类的约束而已(即public才能当全局,非public只能在本类对象中使用)。
既然是类似于全局函数,就和对象无关了。
你要在static成员函数中,使用某类的成员变量的话。你要首先保证某类的“对象”的存在,没有"对象"也就没有对象的成员变量。而static成员函数是全局函数,不依赖于"对象"的,即不需要创建出"对象"也可以调用static成员函数。所以调用static成员函数的时候,此函数归属的"对象"是不存在的(static根本没有归属的对象)。因此“使用类的成员变量”这句话的“类”对象是不存在的。
static函数没有归属的对象,自然也就使用不了对象的成员变量。但是它可以修改其他对象的成员变量。
你可以创建一个"对象",再把"对象"作为参数,传递给static函数,然后再在static函数内修改此对象参数内部的成员变量,即可。
既然是类似于全局函数,就和对象无关了。
你要在static成员函数中,使用某类的成员变量的话。你要首先保证某类的“对象”的存在,没有"对象"也就没有对象的成员变量。而static成员函数是全局函数,不依赖于"对象"的,即不需要创建出"对象"也可以调用static成员函数。所以调用static成员函数的时候,此函数归属的"对象"是不存在的(static根本没有归属的对象)。因此“使用类的成员变量”这句话的“类”对象是不存在的。
static函数没有归属的对象,自然也就使用不了对象的成员变量。但是它可以修改其他对象的成员变量。
你可以创建一个"对象",再把"对象"作为参数,传递给static函数,然后再在static函数内修改此对象参数内部的成员变量,即可。
追问
我在类中还声明了一个指向本类的静态指针,它在静态函数中可以访问。我应该在哪里把指针初始化,指向一个类对象呢?
追答
把静态指针看作静态全局变量来看待。在这个静态指针创建的时候初始化。例如:
AA.h中()
class AA
{
public:
static void StaticFunc() { AAPointer->member = 1; } //访问AAPointer
static AA * AAPointer;
}
在AA.cpp中
AA * AA::AAPointer = new AA(); //这里初始化
展开全部
在类声明后,直接初始化就好啊,,
写个例子
class A
{
public:
A(int nData)
{
data = nData;
}
int data;
public:
static A *p;
static void fun();
};
A* A::p = new A(100);
void A::fun()
{
printf("%d\n",p->data);
}
int main()
{
A::fun();
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
创建一个"对象",再把"对象"作为参数,传递给static函数,然后再在static函数内修改此对象参数内部的成员变量
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-09-14
展开全部
不可以使用,但你可以传个此类对象作参数来操作它
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-09-14
展开全部
由于静态成员函数可以不以捆绑对象的形式调用,静态成员函数被调用时,没有当前对象的信息,所以静态成员函数不能访问非static 成员变量.
比如,name是一非静态成员变量,则:static int printNumber(){cout<<number<<endl;}编译通不过,但是不说明它没有访问非静态成员变量的权利如果给它传递一个对象就可以了。
比如:Student是一个类,static int printNumber(Student& s){cout<<s.number<<endl;}就可以访问了。
希望对你有帮助。
比如,name是一非静态成员变量,则:static int printNumber(){cout<<number<<endl;}编译通不过,但是不说明它没有访问非静态成员变量的权利如果给它传递一个对象就可以了。
比如:Student是一个类,static int printNumber(Student& s){cout<<s.number<<endl;}就可以访问了。
希望对你有帮助。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询