在写程序是经常会遇到这种情况:需要统计某一个类的所有对象实例的个数。一个比较简单的方法是使用一个全局的变量,但是其缺点也是显而易见的。使用static成员可以很好的解决这个问题。相对与使用全局变量使用static成员有以下优势
1) static成员是在类的作用域内,很好的避免了和其他全局变量重名的问题。
2)可以实现封装,static成员在访问控制上和其他的成员一样可以为private
2)可以很容易的看出变量的含义,和类的关联。是一种比较好的代码风格。
在C++中定义和使用static成员与在Java和C#中有较大的区别。本人已经遇到过很多错误,这里总结下用法:
一、static成员的声明和定义
static成员的声明在class类定义体里
示例:
1 class TestClass 2 { 3 private: 4 static int itemCount; 5 static int initItemCount(); 6 };
如果仅这样声明就去调用static成员,一定会遇到undefined 的错误,static成员的定义需要在类定义的外部:
1 int TestClass::itemCount = initItemCount();
在定义是不需要在加static关键字。static成员函数的定义和成员变量定义的规则是一样的,这里不再写出来了。
需要注意的是不能在static成员变量声明的时候对其初始化。
二、 使用static成员
在类的内部可以直接使用static成员:
1 class TestClass 2 { 3 public: 4 TestClass(); ~TestClass(); 5 static int getItemCount(); 6 private: 7 static int itemCount; 8 static int initItemCount(); 9 };
1 TestClass::TestClass() 2 { 3 itemCount++; 4 } 5 6 int TestClass::itemCount = initItemCount(); 7 8 int TestClass::initItemCount() 9 { 10 return 0; 11 } 12 13 TestClass::~TestClass() 14 { 15 itemCount--; 16 }
在类的外部调用static成员:
1 #include <iostream> 2 #include "TestClass.h" 3 int main() 4 { 5 TestClass t; 6 TestClass *pt = &t; 7 t.initItemCount(); 8 pt->initItemCount(); 9 TestClass::initItemCount(); 10 return 0; 11 }
三、const static成员变量
const static 成员变量必须在声明的同时对其进行初始化。