1. 静态数据成员
为了实现同一个类的多个对象之间的数据共享,C++提出了静态数据成员的概念。在一个类中 ,若将一个数据成员说明成static,这种成员被称为静态数据成员。与一般的数据成员不同,无论建立多少个类的对象,都只有一个静态数据成员的拷贝。从而实现了同一个类中的不同对象之间的数据共享。
定义静态数据成员的格式如下:
static 数据类型 数据成员名
说明:
(1)静态数据成员的定义与普通数据成员相似,但前面要加上static关键字。
(2)静态数据成员的初始化与普通数据成员不同。静态数据成员初始化应在类外单独进行,而且应在定义对象之前进行。一般在主函数main之前,类声明之后的特殊地带为它提供定义和初始化。
1 | 初始化的格式如下: |
(3)静态数据成员属于类(准确地说,是属于类对象的集合),而不像普通数据成员那样属于某一对象,因此可以使用使用“类名:”访问静态的数据成员。
1 | 用类名访问静态数据成员的格式如下: |
(4)静态数据成员与静态变量一样,是在编译时创建并初始化。它在该类的任何对象被建立之前就存在。因此,公有的静态数据成员可以在对象定义之前被访问。对象定义后,公有的静态数据成员,也可以通过对象进行访问。
1 | 对象名.静态数据成员名; |
(5)私有静态数据成员不能在类外直接访问,必须通过公有的成员函数访问。
(6)C++支持静态数据成员的一个重要原因是可以不必使用全局变量。依赖于全局变量的类几乎都是违反面向对象程序设计的封装特性的。静态数据成员主要用作类的所有对象所共有的数据,如统计总数、平均数等。
2. 静态成员函数
在类定义中,前面有static说明的成员函数被称为静态成员函数。静态成员函数属于整个类,是该类所有对象共享的成员函数,而不是类中的某个对象。
1 | 定义静态成员函数的格式如下: |
例:静态成员函数访问静态数据成员。
1 |
|
下面对静态成员函数的使用再作几点说明:
(1)一般情况下,静态函数成员主要用来访问静态数据成员。当它与静态数据成员一起使用时,达到了对同一个类中对象之间共享数据的目的。
(2)私有静态成员函数不能做类外部的函数和对象访问。
(3)使用静态成员函数的一个原因是,可以用它在建立任何对象之前调用静态成员函数,以处理静态数据成员,这是普通成员函数不能实现的功能。
1 | int main(){ |
(4)编译系统将静态成员函数限定为内部连接,也就是说,与现行文件相连接的其他文件中的同名函数不会与该函数发生冲突,维护了该函数使用的安全性,这是使用静态成员函数的另一个原因。
(5)静态成员函数是类的一部分,而不是对象的一部分。
(6)静态成员函数与非静态成员函数的重要的区别是:非静态成员函数有this指针,而静态成员函数没有this指针。静态成员函数可以直接访问本类中的静态数据成员,因为静态数据成员同样是属于类的,可以直接访问。一般而言,静态成员函数不访问类中的非静态成员。若确实需要访问非静态数据成员,静态成员函数只能通过对象名(或对象指针、对象引用)访问该对象的非静态成员。