C++入门经典-例7.4-类的静态成员,我们共有一个地球
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-类的静态成员,我们共有一个地球的更多相关文章
- C++入门经典-例8.3-子类显示调用父类构造函数
1:当父类含有带参数的构造函数时,创建子类的时候会调用它吗?答案是通过显示方式才可以调用. 无论创建子类对象时调用的是那种子类构造函数,都会自动调用父类默认构造函数.若想使用父类带参数的构造函数,则需 ...
- C++入门经典-例7.6-this指针,同一个类的不同对象数据
1:对于类的非静态成员,每个对象都有自己的一份拷贝,即每个对象都有自己的数据成员,不过成员函数却是每个对象共享的.那么调用共享的成员函数如何找到自己的数据成员呢?答案是通过类中隐藏的this指针. 2 ...
- C++入门经典-例7.10-运算符的重载,重载加号运算符
1:曾经介绍过string类型的数据,它是C++标准模版库提供的一个类.string类支持使用加号“+”连接两个string对象.但是使用两个string对象相减确实非法的,其中的原理就是C++所提供 ...
- C#入门经典第九章定义类-1
1.C#中使用class关键字来定义类 class MyClass { //代码部分 } 定义了类之后,就可以在项目中能访问该定义的其他位置对该类进行实例化.默认情况下,类的声明是内部的,即只有当前项 ...
- C++入门经典-例8.5-多重继承
1:C++允许子类从多个父类继承公有的和受保护的成员,这称为多重继承. 2:多重继承的定义.多重继承有多个基类名称标识符,其声明形式如下: class 派生类名标识符:[继承方式] 基类名标识符1,. ...
- C++入门经典-例9.3-类模板,简单类模板
1:使用template关键字不但可以定义函数模板,而且可以定义类模板.类模板代表一族类,它是用来描述通用数据类型或处理方法的机制,它使类中的一些数据成员和成员函数的参数或返回值可以取任意数据类型.类 ...
- C++入门经典-例8.9-抽象类,纯虚函数,创建纯虚函数
1:包含有纯虚函数的类称为抽象类,一个抽象类至少具有一个纯虚函数.抽象类只能作为基类派生出的新的子类,而不能在程序中被实例化(即不能说明抽象类的对象),但是可以使用指向抽象类的指针.在程序开发过程中并 ...
- C++入门经典-例7.5-对象的指针,函数指针调用类成员
1:指向相应对象的指针就是对象的指针,它的生明方法与其他类型一样,如下: 类名 *p; 类的指针可以调用它所指向对象的成员.形式如下: p->类成员; 2:代码如下: (1)cat.h #inc ...
- C++入门经典-例7.1-对象之访问类成员
1:建立一个类CPerson. (1)在person.h文件中代码: class CPerson { public: //数据成员 int m_iIndex; ]; short m_shAge; do ...
- C++入门经典-例9.5-为具体类型的参数提供默认值
1:默认模板参数是指类模板中由默认的数据类型作为参数的参数,在模板定义时,还可以为默认的数据类型声明,变量,并为变量赋值.代码如下: // 9.5.cpp : 定义控制台应用程序的入口点. #incl ...
随机推荐
- openlayers加载天地图过程中遇到跨域问题
// 采用openlayers加载天地图 var layer = new ol.layer.Tile({ source: new ol.source.XYZ({ // crossOrigin: 'An ...
- day09 并发编程
一. 目录 1.进程的概念和两种创建方式 2.多进程爬虫 3.守护进程 4.进程队列 5.进程队列简单应用(实现数据共享) 6.线程的两种创建方式 7.线程和进程的效率对比 8.线程共享统一进程的数据 ...
- redis的使用(Java使用Jedis客户端连接redis)
一.添加依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis&l ...
- latex中文环境配置(针对北大模板,开题报告+中期答辩+毕业论文)
最近自己在忙着开题,中文环境真的是emm 以下只针对北大的毕业论文模板,至于其他的中文环境没有尝试 主要是用不同的latex编辑器会报不同的错误,当然我最后还是统一成了pdflatex,经过无数次尝试 ...
- Scrapy - 第一个爬虫和我的博客
第一个爬虫 这里我用官方文档的第一个例子:爬取http://quotes.toscrape.com来作为我的首个scrapy爬虫,我没有找到scrapy 1.5的中文文档,后续内容有部分是我按照官方文 ...
- mysql使用存储过程,批量生成测试数据
1.存储过程代码 delimiter $$DROP PROCEDURE IF EXISTS create_service_data$$create procedure create_service_d ...
- zabbix4.2Proxy安装文档
zabbix4.2Proxy安装文档 目录 zabbix4.2Proxy安装文档 1 一.安装 2 1.前期安装准备 2 2.安装zabbix RPM源 3 2.1下载zabb ...
- java开发技巧
1,IDEA辅助功能Shift +F2去到有错误的地方Alt+Enter,会给出解决错误的建议: 2,调试,没问题的步骤,直接跳过,不要跳入细节: 调试时,要明确要跟踪的变量,不要陷入混乱: 3,调试 ...
- Centos7网卡配置命令nmcli
在配置Centos6时,大家第一想到的就是把networkManager这个服务关掉,让它消失,这个服务台太鸡肋了,不该起作用的时候经常起作用,给管理带来了不便,但是在Centos7当中network ...
- 201871010101-陈来弟《面向对象程序设计(java)》第十七周学习总结
实验十七 线程同步控制 实验时间 2018-12-10 第一部分:理论知识 1.多线程并发执行中的问题 ◆多个线程相对执行的顺序是不确定的. ◆线程执行顺序的不确定性会产生执行结果的不确定性. ◆在 ...