1:静态数据在程序开始时即获得空间,直到程序结束后才被收回。静态数据可以声明在函数体内,也可以声明在函数体外。

类中的静态成员与非静态成员有很大区别。从使用上来将,调用静态成员不需要实例化对象,而是以如下形式调用:

类名::静态成员

从类的设计思想来看,静态成员应该是类共用的。若想在静态函数中使用某些成员变量,可以在形参列表中实例化本类的对象,这样就可以在函数中使用该对象的成员。

2:实例代码如下:

(1)human.h

#include <string>
using std::string;
class human{
public:
string m_name;
human();
human(string name);
static int nTheEarth;//静态变量,以数量表示环境的好坏
static void GetFeel(human h);//人类对环境的感觉
void Protect();//
void Destroy();
};

(2)human.cpp

#include "stdafx.h"
#include "human.h"
#include <iostream>
using std::endl;
using std::cout; int human::nTheEarth = ; //静态变量初始化!!!
human::human()
{
m_name = "佚名";
}
human::human(string name)
{
m_name = name;
}
void human::Destroy()
{
human::nTheEarth-=;
cout<<m_name<<"破坏了环境"<<endl;
}
void human::Protect()
{
human::nTheEarth+=;
cout<<m_name<<"劲微薄之力保护了环境"<<endl;
} void human::GetFeel(human h)
{
cout<<"环境现在的情况:";
if(nTheEarth>)
cout<<"世界真美好"<<endl;
else if(nTheEarth>)
cout<<"空气还算新鲜,但总觉得还是差了一些"<<endl;
else if (nTheEarth>)
cout<<"天不蓝,水不清,勉强可以忍受"<<endl;
else if(nTheEarth>)
cout<<"树木稀少,黄沙漫天"<<endl;
else if (nTheEarth>)
cout<<"呼吸困难,水源稀缺"<<endl;
else if (nTheEarth>)
cout<<"难道世界末日到了么?"<<endl; if(nTheEarth<)
{
cout<<"感到环境变的很糟糕,";
h.Protect();
}
}

(3)main.cpp

// 7.4.cpp : 定义控制台应用程序的入口点。
// #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 = ;day<;day++)
{
h1.Protect();
h2.Destroy();
if(day% == )
h3.Destroy();
else
h3.Protect();
} cout<<"现在的环境指数:"<<human::nTheEarth<<",看来人类需要行动起来了..."<<endl;
for(int day = ;day<;day++)
{
h1.Protect();
human::GetFeel(h2);
h3.Protect();
}
cout<<"现在的环境指数:"<<human::nTheEarth<<endl;
return ;
}

运行结果:

程序中,Protect和Destroy方法都对静态成员nTheEarth进行了操作。可以看出,每个human实例执行两个函数后,静态成员nTheEarth都会变化,这个值是所有对象所共用的。主函数使用区域符调用了human类的静态方法GetFeel()。

C++入门经典-例7.4-类的静态成员,我们共有一个地球的更多相关文章

  1. C++入门经典-例8.3-子类显示调用父类构造函数

    1:当父类含有带参数的构造函数时,创建子类的时候会调用它吗?答案是通过显示方式才可以调用. 无论创建子类对象时调用的是那种子类构造函数,都会自动调用父类默认构造函数.若想使用父类带参数的构造函数,则需 ...

  2. C++入门经典-例7.6-this指针,同一个类的不同对象数据

    1:对于类的非静态成员,每个对象都有自己的一份拷贝,即每个对象都有自己的数据成员,不过成员函数却是每个对象共享的.那么调用共享的成员函数如何找到自己的数据成员呢?答案是通过类中隐藏的this指针. 2 ...

  3. C++入门经典-例7.10-运算符的重载,重载加号运算符

    1:曾经介绍过string类型的数据,它是C++标准模版库提供的一个类.string类支持使用加号“+”连接两个string对象.但是使用两个string对象相减确实非法的,其中的原理就是C++所提供 ...

  4. C#入门经典第九章定义类-1

    1.C#中使用class关键字来定义类 class MyClass { //代码部分 } 定义了类之后,就可以在项目中能访问该定义的其他位置对该类进行实例化.默认情况下,类的声明是内部的,即只有当前项 ...

  5. C++入门经典-例8.5-多重继承

    1:C++允许子类从多个父类继承公有的和受保护的成员,这称为多重继承. 2:多重继承的定义.多重继承有多个基类名称标识符,其声明形式如下: class 派生类名标识符:[继承方式] 基类名标识符1,. ...

  6. C++入门经典-例9.3-类模板,简单类模板

    1:使用template关键字不但可以定义函数模板,而且可以定义类模板.类模板代表一族类,它是用来描述通用数据类型或处理方法的机制,它使类中的一些数据成员和成员函数的参数或返回值可以取任意数据类型.类 ...

  7. C++入门经典-例8.9-抽象类,纯虚函数,创建纯虚函数

    1:包含有纯虚函数的类称为抽象类,一个抽象类至少具有一个纯虚函数.抽象类只能作为基类派生出的新的子类,而不能在程序中被实例化(即不能说明抽象类的对象),但是可以使用指向抽象类的指针.在程序开发过程中并 ...

  8. C++入门经典-例7.5-对象的指针,函数指针调用类成员

    1:指向相应对象的指针就是对象的指针,它的生明方法与其他类型一样,如下: 类名 *p; 类的指针可以调用它所指向对象的成员.形式如下: p->类成员; 2:代码如下: (1)cat.h #inc ...

  9. C++入门经典-例7.1-对象之访问类成员

    1:建立一个类CPerson. (1)在person.h文件中代码: class CPerson { public: //数据成员 int m_iIndex; ]; short m_shAge; do ...

  10. C++入门经典-例9.5-为具体类型的参数提供默认值

    1:默认模板参数是指类模板中由默认的数据类型作为参数的参数,在模板定义时,还可以为默认的数据类型声明,变量,并为变量赋值.代码如下: // 9.5.cpp : 定义控制台应用程序的入口点. #incl ...

随机推荐

  1. luogu题解P4198楼房重建--线段树神操作

    题目链接 https://www.luogu.org/problemnew/show/P4198 分析 一句话题意,一条数轴上有若干楼房,坐标为\(xi\)的楼房有高度\(hi\),那么它的斜率为\( ...

  2. 文件下载不可以使用ajax

    参看网站:https://blog.csdn.net/fan510988896/article/details/71520390 总结一下为什么下载请求不能放在ajax里发送: 原因:因为respon ...

  3. vue进阶:基于vue-cli创建项目(搭建手脚架)

    vue-cli安装.创建项目 基于vue-cli创建的项目进行开发 使用vue-cli图形化界面搭建项目 插件与工具 一.vue-cli简介.安装.创建项目 Vue-cli是基于Vue.js进行快速开 ...

  4. css,使两个在同一行内的display:inline-block的div顶部对齐。

    两个都加上:vertical-align:top;

  5. centos7andcentos6初始化脚本

    #!/bin/bash # get OS verison RELEASEVER=$(rpm -q --qf "%{Version}" $(rpm -q --whatprovides ...

  6. Creating a PXE Configuration File

      The PXE configuration file defines the menu displayed to the pxe client host as it boots up and co ...

  7. centos 7 源代码 mysql-5.7.2 安装

    CENTOS MYSQL 5.7 下载MySQL 5.7 https://dev.mysql.com/downloads/mysql/5.7.html#downloads cd /usr/local/ ...

  8. C++实例 分解质因数

    分解质因数: 每个合数都可以写成几个质数相乘的形式.其中每个质数都是这个合数的因数,叫做这个合数的分解质因数.分解质因数只针对合数. 分解质因数的算式叫短除法.求一个数分解质因数,要从最小的质数除起, ...

  9. Spring基础01——在IDEA中编写spring.xml

    如果需要在IDEA自动创建spring.xml配置文件,那么我们就需要先引入Spring相关的依赖 <dependency> <groupId>org.springframew ...

  10. TCP的ACK原理和延迟确认机制

    某天晚上睡觉前突然想到 tcp的ACK确认是单独发的还是和报文一起发的,下面看一下别人的解答 一.ACK定义TCP协议中,接收方成功接收到数据后,会回复一个ACK数据包,表示已经确认接收到ACK确认号 ...