先看代码
#include <iostream> #include <conio.h> using namespace std; class test { public: static int i; //(1) static const int count = 1; // 静态常量成员可以在类内初始化//(2) test() {} void print(); private: static int j; }; int test::i = 2; //(1) int test::j = 3; void test::print() { cout << "i = "<< i << endl; cout << "j = "<< j << endl; } int main() { test t; t.print(); cout << "i = "<< t.i << endl;//(3) //cout << "j = "<< t.j << endl;//测试是否可以不受private作用 (4) return 0; }
输出:
程序运行成功,从注释中的(1)~(4)标记的位置可以看到,静态数据成员在使用时有一下一些特点。
1、类的静态成员(static member)必须在类内声明,在类外初始化。因为静态成员属于整个类,而不属于某个对象。标记(1)。
2、类的静态成员可以直接被类名调用。i的初始化语句说明了这点,同时注意类外初始化不再需要static关键字。标记(1)。
3、静态常量成员可以在类内初始化。静态常量数据成员可以在类内初始化(即类内声明的同时初始化),也可以在类外,即类的实现文件中初始化,不能在构造函数中初始化,也不能在构造函数的初始化列表中初始化。标记(2)。
4、静态数据成员可以被类对象调用。尽管静态数据成员不属于某个对象。标记(3)。
5、静态数据成员能受private控制符的作用。静态数据成员是可以为private类型的,能受private控制,但是private类型的静态数据只能被类成员函数访问,类外对象不能直接调用,因为对象不能调用类的私有类型。main函数里被注释掉的cout语句不能编译通过。标记(4)。