类的静态成员是指声明为static的成员(包括成员函数和成员数据)。静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值,const修饰符等参数;静态成员的声明即在普通成员的声明前加static,其必须在类外定义,在定义时不加static;当一个成员被声明为静态成员后这个成员就不属于某个具体的实例,而是为所有的类对象所共享;类的静态成员和其他成员函数一样存放在独立于对象之外的代码段,静态成员函数和普通成员函数的区别是静态成员函数没有this指针,而静态成员函数里面定义的局部变量则和正常的函数一样,只有声明为static时才存放在静态区;静态成员的访问可用类名::静态成员或者对象.静态成员来访问。
静态成员数据的声明、定义及访问:
class A
{
public:
A(int _a):a(_a)
{
;
}
private:
int a;
static int b;
};
int A::b = 0;
上面代码中,静态数据成员b在类内声明为static,在类外定义,因为静态成员独立于类的对象,因此不能在构造函数中对其进行初始化,所以在类外定义是对其赋初值,这里b的访问权限是private的,因此只能在成员函数中访问,我们可以用如下方式进行访问:
class A
{
public:
A(int _a):a(_a)
{
;
}
void B(int tmp)
{
A::b += 1;
}
private:
int a;
static int b;
};
int A::b = 0;
我们调用两次函数B,看看是否访问成功:
int main()
{
A a1(1);
a1.B(1);
a1.B(1);
return 0;
}
对齐进行调试,观察结果:
显然,调用成功。除此之外,还可以用对象::静态成员的方式访问,因为静态成员不属于任何对象,因此同一个类的任何对象都可以进行访问,在此不多做累述。
下面我们来看看静态成员函数和普通成员函数是否能够相互调用:
我们首先来看一下静态成员函数是否可以访问普通成员函数,我们写下如下代码:
class A
{
public:
void B(int tmp);
static void C(int);
private:
int a;
};
void A::C(int)
{
B(1);
}
我们看能不能通过编译:
显然不行,我们再来看普通成员函数是否可以调用静态成员函数:
class A
{
public:
void B(int tmp)
{
C(1);
}
static void C(int);
private:
int a;
};
void A::C(int)
{
;
}
我们来看看能否调用成功:
可以看出能成功调用,显然,静态成员函数可以调用普通成员函数。
通过上面的探讨,我们可以知道静态成员函数不能调用普通成员函数,而普通成员函数是可以调用静态成员函数的。关于类的静态成员的知识还有很多,希望我们可以在今后的学习中学到更多的知识。