C++中的全局数据对于任何一个类的对象或其他源程序来说都是相等的,与C一样放在所有类和函数外面
如果在一个.cpp文件中定义了一个全局变量,其他的源文件要用是时,必须加上extern说明。
使用全局变量会带来不安全性,因为全局数据在整个程序中都是可见的,都可以对其进行修改,若不小心改错了将会影响整个程序的运行结果。并且全局变量与对象程序的封装性是相悖的,破坏了设计的信息隐藏。
为此C++提出了静态数据成员的概念,静态数据成员的值对同一个类的每一个对象都是一样的,一但某个对象中的静态数据成员更改了,则所有对象都会访问到更新后的值。
定义如下:
static <数据类型> <静态数据成员名>;
静态数据成员有如下性质:
- 是某类的所有对象都共享的数据成员。静态数据成员独立于类的任何对象而存在,与类关联,但不是与类对象关联。
- 必须对他进行初始化,其的初始化在类外进行,而前面不加static,以避免与一般静态变量或对象混淆。初始化时不加该成员的访问权限控制符private,public 等。初始化时要用作用域标明所属类。格式为 <数据类型> <类名> :: <静态数据成员名> = <值>;
- 静态数据成员的引用方式 静态数据成员可以定义为private或public 。如果是定义为public,可直接引用。格式为:<类名>::<静态成员名> 或 <对象名>.<静态成员名> 或 <对象指针>-><静态成员名>。如果是定义为private,只有通过公共接口函数引用
class Student{ public: static int counts; Student( ){ Counts++ ; } }; int Student::Counts = 0 ; int main() { Student stu1,stu2; cout<<"the number is :"<<Student :: Counts<<endl; return 0; }
也可以定义类的静态成员函数 :static <成员函数>
static 成员函数没有this指针,因其不是任何对象的组成部分。它可以直接访问所属类的static成员,但不能直接访问非static 成员static 成员函数在类外实现时前面也不加static。另外,不能用const修饰,也不能申明为虚函数。