一、静态数据成员
C++允许将类的数据成员定义为静态成员。静态数据成员是属于类的,整个类只有一个备份,相当于类的全局变量,能够被该类的所有对象共用。
1.静态成员的声明
在类数据成员的声明前加上关键字static,就将该成员指定成了静态数据成员。静态数据成员遵守public、private、protected访问权限的限定规则。如:
class Account
{
public:
Account(); //构造函数
~Account(); //析构函数
//.....................
private:
static int number; //静态数据成员声明
//.....................
}
2.静态数据成员的定义
在类的声明中将数据成员指定为静态成员,只是一种声明,并不会为该成员分配内存空间,在使用之前应该对他进行定义。静态数据成员常常在类外进行定义,与类成员函数的定义方法一样。定义形式如:
1 //类型 类名::静态成员名;
2 //类型 类名::静态成员名 = 初始值
3 int Account::number; //定义静态成员并初始化为0
注意:(1)在类外定义静态数据成员时,不能加上static限定词
(2)在定义静态数据成员时可以指定他的初始值,若定义是没有指定初始值,系统将会自动赋上默认值
3.静态数据成员的访问
静态成员属于整个类,如果将他定义为类的公有成员,在类外可有两种方式访问。
a)通过类名访问
类名::静态成员名
b)通过对象访问
对象名.静态成员名
4.静态数据成员与非静态数据成员的区别
(1)非静态数据成员与对象关联,每个对象拥有独立的数据成员备份。静态数据成员与类关联,整个类只有一份静态数据成员备份,由全类所有对象共用。(C++会为对象的非静态数据成员分配独立的内存空间,而静态数据成员在内存中则只分配一次)
(2)非静态数据成员只有在定义了对象之后才存在(也就是分配内存空间)。静态数据成员不属于单个对象,即使没有定义他所属类的任何对象时,就已经存在了。
(3)非静态数据成员的作用域限定在定义对象的块作用域内,静态数据成员自他的定义开始到程序结束之前有效。
二、静态成员函数
在类成员函数的原型前面加上static就将他定义成了静态成员函数。静态成员函数属于整个类,他只能访问该类的静态成员(包括静态数据成员和静态成员函数),不能访问非静态成员(包括非静态数据成员和非静态成员函数)。
1.静态成员函数的声明定义
class Account
{
public:
Account(); //构造函数
~Account(); //析构函数
//.....................
static int getNumber() //定义静态成员函数
{
return number; //访问静态数据成员
}
private:
static int number; //静态数据成员声明
//.....................
}
2.调用方式
静态成员函数的调用方式有两种:
a)类调用方式
类名::静态成员函数名(参数表);
b)对象调用
对象名.静态成员函数名(参数表);
3.特别注意
(1)和普通成员函数一样,静态成员函数也可以在类内或类外定义,还可以定义成内联函数
(2)静态函数只能访问静态成员(包括静态数据成员和静态成员函数),不能访问非静态成员(包括非静态数据成员和非静态成员函数)
(3)在类外定义静态成员函数时,不能加上static限定词
(4)静态成员函数可以在定义类的任何对象之前被调用,非静态成员只有在定义对象后,通过对象才能访问