C++核心技术篇(三)

类的静态成员

首先,让我们回顾一下静态成员数据的概念。静态数据在程序开始时即获得空间,直到程序结束后才被回收。静态成员可以声明在函数体内也可以声明在函数体外。那么类可否有静态成员呢?答案是肯定的。
类中的静态成员和非静态成员有很大区别。从使用上来讲,调用静态成员不需要实例化对象,而是以如下形式调用:

类名::静态成员

从设计思想来看,静态成员应该是类共用的。以人类为例子,人有很多的属性:姓名、年龄、身高等。显然这些不是共用的,一个具体人的名字、年龄不能交给所有人使用。在人类中添加一个属性:生存环境。具体以何种数据类型来表示他,视情况而定:好坏或质量等级,但重要的是,他一定是一个静态变量。因为对人类而言,生存环境是共用的。类中的静态函数无法调用非静态成员变量,非静态成员变量在类未实例化是无法在内存中一直存在。若想在静态函数中使用某些成员变量,可以在形参列表中实例化本类的对象,这样在函数中可以使用该类的成员。
例:我们共有一个地球

//***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().
和其他静态变量一样,类的静态成员也需要初始化。初始化类的静态成员变量时必须在外部定义,而且要标明静态变量的类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茫渡。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值