声明为static的类成员或者成员函数便能在类的范围内共同享,我们把这样的成员称做静态成员和静态成员函数。
例如:
class A
{
public:
static int n;//定义一个静态数据成员
};
在定义静态数据数据成员时,通常需要要类体外部对静态数据成员进行初始化。
例如:
int A::n=10;//初始化静态数据成员
例如:
int main()
{
A a;
cout<<A::n;// 通过类名访问静态成员,不能是A.a;
cout<<a.n;//通过对象访问静态成员
}
在一个类中,静态数据成员是被所有的类对象所共享的,这就意味着无论定义多少个类对象,类的静态数据成员只有一个,同时,如果某个对象修改了静态数据成员,其它对象的静态数据成员也将改变。
对于静态数据成员,还需要注意以下几点:
(1)静态数据成员可以是当前类的类型,而其它数据成员只能是当前类的指针或应用类型(int,double等).
在定义类成员时,对于静态数据成员,其类型可以是当前类的类型,而非静态数据成员则不可以,除非数据成员的类型为当前类的指针或者引用类型。
例如:
class A
{
public:
static int n;
A a1;// 非法
static A a2;//正确
A *a3;//正确
};
(2)静态数据成员可以作为成员函数的默认参数。
在定义类的成员函数时,可以为成员函数指定默认参数,其参数的默认值也可以是类的静态数据成员,但是其它的的数据成员则不能作为成员函数的默认参数。
例如:
class A
{
public:
static int n;
int m;
void OutPut_1(int data=n)
{
cout<<data<<endl;
}
void OutPut_2(int data=m)// 非法
{
cout<<data<<endl;
}
};
在介绍完类的静态数据成员之后,下面介绍类的静态成员函数。定义类的静态成员函数与定义普通的成员函数类似,只需在前面加了static关键字。
例如:
static void OutPut();
类的静态成员函数只能访问类的静态数据成员,其它普通数据成员不能访问。
例如:
class A
{
public:
static int n;
int m;
static void OutPut()
{
cout<<n<<endl;//正确
cout<<m<<endl;//非法
}
};
类的非静态成员函数既可以访问静态数据成员,又可以访问非静态数据成员。
例如:
class A
{
public:
static int n;
int m;
void OutPut()
{
cout<<n<<endl;//正确
cout<<m<<endl;//正确
}
};
类的静态成员函数既不可以访问静态函数成员也不可以访问非静态函数成员,因为在静态函数成员中不能使用this关键字。
此外,对于静态成员函数不能定义为const成员函数,即静态成员函数末尾不能使用const关键字。
例如:
static void OutPut()const;//非法
在定义静态数据成员函数时,如果函数在实现代码处于类体之外,则在函数的实现部分不能再识static关键字。
总结:
1.因为 static 关键字,表明无论是成员函数,还是成员数据,它都不属于某个特定的对象(虽然可以通过对象名来访问),而是属于整个类(即所有的对象)。
2.静态数据成员既能被静态函数成员访问,也能被非静态函数成员访问
3.静态函数成员只能访问静态数据成员