定义数据成员(方法)的类型(一)——静态数据成员和静态方法

——什么时候使用静态数据成员

  • 没必要让所有类对象都包含某个变量的副本(需要被类及派生类的所有对象共享);
  • 或者这么做无法完成特定的任务

 例如:一个类内部的计数器(每产生一个对象,自动加1),此时就没有必要使类的每个对象都包含这样的副本

——怎么定义静态数据成员

  • C++11版本
    • static int sCounter = 0; //直接在头文件中类的定义中声明和定义即可
  • 以前的版本
    • Step1:在类定义中声明:static int sCounter;
    • Step2:在cpp中初始化:const className::sCounter = 0;

——怎么使用静态数据成员

  • 在类的方法内访问:同普通数据成员
  • 在类的方法外访问(假设静态数据成员是public)
    • int c = className::sCounter; //使用作用域::
    • 最好:不要使用public,而是提供公有get/set()方法

——静态数据成员的实质

  • 静态数据成员实际上是类域中的全局变量;
  • 不管类的对象有多少个,其静态数据成员只有一个,各对象共享;

  • 在一个类的对象空间内,不包含静态成员的空间,所以静态成员所占空间不会随对象的产生而分配,也不会随对象的消失而收回;
  • 静态数据成员的存储空间的分配在程序一开始运行时就被分配,并不是在程序运行过程中在某一函数内分配空间和初始化

 

——静态方法

  • 与静态数据成员类似,静态方法也不属于某个对象,而是为类及其派生类的所有对象所共享;
  • 因为不属于特定对象,故没有this指针;
  • 实际上,静态方法就像一个普通函数(而不是类方法)
    • 如果是私有或保护的静态方法:在类内可以像调用普通函数一样调用;
    • 如果是公有的静态方法:在类外也可以调用,只是需要加上作用域:className::XXX
posted @ 2013-02-22 09:01  卧野观云  阅读(797)  评论(0编辑  收藏  举报