类的静态成员
首先,让我们回顾一下静态成员数据的概念。静态数据在程序开始时即获得空间,直到程序结束后才被回收。静态成员可以声明在函数体内也可以声明在函数体外。那么类可否有静态成员呢?答案是肯定的。
类中的静态成员和非静态成员有很大区别。从使用上来讲,调用静态成员不需要实例化对象,而是以如下形式调用:
类名::静态成员
从设计思想来看,静态成员应该是类共用的。以人类为例子,人有很多的属性:姓名、年龄、身高等。显然这些不是共用的,一个具体人的名字、年龄不能交给所有人使用。在人类中添加一个属性:生存环境。具体以何种数据类型来表示他,视情况而定:好坏或质量等级,但重要的是,他一定是一个静态变量。因为对人类而言,生存环境是共用的。类中的静态函数无法调用非静态成员变量,非静态成员变量在类未实例化是无法在内存中一直存在。若想在静态函数中使用某些成员变量,可以在形参列表中实例化本类的对象,这样在函数中可以使用该类的成员。
例:我们共有一个地球
//***human.h声明了human类***//
#include<string>
using std::string;
class human{
public:
string m_name;
human();
human(string nsme);
static int nTneEarth;
static void GetFeel(human h);
void Protect();
void Destroy();
};
human.cpp实现了human类,代码如下:
#include"stdafx.h"
#include<human.h>
#include<iostream>
using std::endl;
using std::cout;
int human::nTheEarth=101;
human::human(){
m_name="nomame";
}
human::human(string name){
m_name-name;
}
void human::Destroy(){
human::nTheEarth-=20;
cout<<m_name<<"破坏了环境”<<endl;
}
void human::Protect(){
human::nTheEarth+=6;
cout<<m_name<<"尽微薄之力保护环境"<<endl;
}
void huamn::GetFeel(human h){
cout<<"环境现在的情况:";
if(nTheEarth>100)
couot<<"世界真美好"<<endl;
else if(nTheEarth>80)
cout<<"空气还算新鲜但总觉得还差了一些"<<endl;
else if(nTheEarth>60)
cout<<"天不蓝水不清,勉强可以忍受"<<endl;
else if(nTheEarth>40)
cout<<"树木稀少,黄沙漫天"<<endl;
else if(nTheEarth>20)
cout<<"呼吸困难,水源稀缺"<<endl;
else if(nTheEarth>0)
cout<<"难道世界末日到了吗?"<<endl;
if(nTheEarth<50){
cout<<"感到环境变得很糟糕"<<endl;
h.Protect();
}
}
程序入口代码如下:
#include"stdafx.h"
#include<iostream>
#include"human.h"
using std::cout;
using std::endl;
int main(){
human h1("雷锋");
human h2("某工厂老板");
human h3("小明");
human::GetFeel(h3);
for(int day=0;day<4;day++){
h1.Protect();
h2.Destroy();
if(day%2==0)
h3.Destroy();
else
h3.Protect();
}
cout<<"现在的环境指数:"<<human::nTheEarth<<",看起来人类需要行到起来了。。。"<<endl;
for(int day=0;day<3;day++){
h1.protect();
human::GetFeel(h2);
h3.protect();
}
cout<<"现在的环境指数"<<human::nTheEarth<<endl;
return 0;
}
程序中,protect和destroy方法对静态成员nTheEarth进行了操作。可以看出,每个human实例执行这两个函数后,静态成员nTheEarth都会变化,这个值是所有对象共用的。主函数使用区域符调用human类的静态方法GetFeel().
和其他静态变量一样,类的静态成员也需要初始化。初始化类的静态成员变量时必须在外部定义,而且要标明静态变量的类型。