定义类的静态成员,能够实现同类的多个对象之间数据共享,使用类的静态成员有如下的优点:
- 静态成员的名字是在类的作用域中,因此可以避免与其他类的成员或全局对象名字冲突;
- 静态成员可以实施封装,可以是私有成员,而全局对象不可以;
- 静态成员是与特定类相关联的,结构清晰。
class Employee{
private:
int maxlevel;
int level;
public:
int c;
static int count;
static int Data(int i=0){ return i;}
};
int Employee::count = 0;
类的静态成员需要在 定义类之后,和用这个类实例化对象之前,给这个类里的静态数据成员初始化,而且初始化的方式必须是在类外。
为什么呢?因为类的静态数据成员是属于类的,为所有的该类的对象所共享,所以必须在实例化对象之前就进行初始化,但是呢,却不可以在类体里初始化,因为,类的定义只是声明了一种数据类型,并没有开辟内存空间,因此也无从初始化了。
同样的道理,类的非静态成员也不能在类体里初始化,因为类的非静态成员只有在类实例化某个对象之后,才开辟出内存空间供其使用。
下面我来看一下类的存储格式:
下面讲述静态数据成员的特点:
- 通常来说,类的非静态数据成员存在于该类类型的每个对象之中,静态数据成员则独立于该类的任何对象,在所有对象之外,单独开辟空间存储。在为对象所分配的空间中不包含静态成员所占的空间。
- 如果只声明了类而未定义对象,则类的非静态数据成员是不占存储空间的,只有在定义对象时,才为对象的数据成员分配空间。但是只要在类中定义了静态数据成员,即使不定义任何对象,也为静态数据成员分配空间,它可以在尚未定义对象时就被引用。
- 访问静态成员(静态数据成员、静态成员函数)时,同样需要遵守公有及私有访问规则。
- 静态数据成员必须在类外部定义,静态成员不能通过类的构造函数进行初始化的,而是在类外定义时进行初始化。
- 静态数据成员可用作默认实参,非静态数据成员不能用作默认实参,因为它的值不能独立于所属的对象而使用。
- 有了静态数据成员,各对象之间实现数据共享,因此可以不使用全局变量。
下面是一个关于静态成员函数的例子:
静态成员函数不能调用非静态数据成员,但可以调用静态数据成员;
而非静态成员函数既可调用非静态数据成员,又可调用静态数据成员。
静态成员函数可以用两种方式来调用,一种是:类名::静态成员函数,另一种是:该类的一个实例对象名 . 静态成员函数。
和静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分。
静态成员函数与非静态成员函数的根本区别是:非静态成员函数有this指针,而静态成员函数没有this指针。因此静态成员函数不能访问本类某个对象的非静态数据成员。(对this指针不懂可以看看这里:this指针)
或者也可以这样记:静态成员函数是专门为了访问静态数据成员的。
注意:静态成员函数不能被声明为const。