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

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

类名::静态成员

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

2:实例代码如下:

(1)human.h

  1. #include <string>
  2. using std::string;
  3. class human{
  4. public:
  5. string m_name;
  6. human();
  7. human(string name);
  8. static int nTheEarth;//静态变量,以数量表示环境的好坏
  9. static void GetFeel(human h);//人类对环境的感觉
  10. void Protect();//
  11. void Destroy();
  12. };

(2)human.cpp

  1. #include "stdafx.h"
  2. #include "human.h"
  3. #include <iostream>
  4. using std::endl;
  5. using std::cout;
  6.  
  7. int human::nTheEarth = ; //静态变量初始化!!!
  8. human::human()
  9. {
  10. m_name = "佚名";
  11. }
  12. human::human(string name)
  13. {
  14. m_name = name;
  15. }
  16. void human::Destroy()
  17. {
  18. human::nTheEarth-=;
  19. cout<<m_name<<"破坏了环境"<<endl;
  20. }
  21. void human::Protect()
  22. {
  23. human::nTheEarth+=;
  24. cout<<m_name<<"劲微薄之力保护了环境"<<endl;
  25. }
  26.  
  27. void human::GetFeel(human h)
  28. {
  29. cout<<"环境现在的情况:";
  30. if(nTheEarth>)
  31. cout<<"世界真美好"<<endl;
  32. else if(nTheEarth>)
  33. cout<<"空气还算新鲜,但总觉得还是差了一些"<<endl;
  34. else if (nTheEarth>)
  35. cout<<"天不蓝,水不清,勉强可以忍受"<<endl;
  36. else if(nTheEarth>)
  37. cout<<"树木稀少,黄沙漫天"<<endl;
  38. else if (nTheEarth>)
  39. cout<<"呼吸困难,水源稀缺"<<endl;
  40. else if (nTheEarth>)
  41. cout<<"难道世界末日到了么?"<<endl;
  42.  
  43. if(nTheEarth<)
  44. {
  45. cout<<"感到环境变的很糟糕,";
  46. h.Protect();
  47. }
  48. }

(3)main.cpp

  1. // 7.4.cpp : 定义控制台应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include "human.h"
  7. using std::cout;
  8. using std::endl;
  9. int main()
  10. {
  11. human h1("雷锋");
  12. human h2("某工厂老板");
  13. human h3("小明");
  14. human::GetFeel(h3);//静态变量要用这种双冒号的表示方法
  15. for(int day = ;day<;day++)
  16. {
  17. h1.Protect();
  18. h2.Destroy();
  19. if(day% == )
  20. h3.Destroy();
  21. else
  22. h3.Protect();
  23. }
  24.  
  25. cout<<"现在的环境指数:"<<human::nTheEarth<<",看来人类需要行动起来了..."<<endl;
  26. for(int day = ;day<;day++)
  27. {
  28. h1.Protect();
  29. human::GetFeel(h2);
  30. h3.Protect();
  31. }
  32. cout<<"现在的环境指数:"<<human::nTheEarth<<endl;
  33. return ;
  34. }

运行结果:

程序中,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. golang(7):文件读写 & json & 错误处理

    终端读写 操作终端相关文件句柄常量 os.Stdin // 标准输入 os.Stdout // 标准输出 (输出到终端) os.Stderr // 标准错误输出 (输出到终端) fmt 常见用法 fm ...

  2. 【opencv源码解析】 二、 cvtColor

    这里以CV_BGR2YUV_I420来讲 1. opencv244 core.cpp void cv::cvtColor( InputArray _src, OutputArray _dst, int ...

  3. JavaMaven【三、常用指令】

    mvn compile --编译,编译后生成target文件,里面包含classes mvn test --执行test,测试后在target下生成reports文件夹,测试报告 mvn packag ...

  4. LSPro建立PXE环境

    一.安装和配置tftp服务 1.安装tftp-hpa ipkg install tftp-hpa       tftp-hpa主要的配置文件有两个: /opt/etc/xinetd.conf /opt ...

  5. python常用模块:sys、os、path、setting、random、shutil

    今日内容讲了3个常用模块 一.sys模块二.os模块三.os下path模块四.random模块五.shutil模块 一.sys模块 import sys #环境变量 print(sys.path) # ...

  6. Hive-ha (十三)

    hive-high Avaliable ​ hive的搭建方式有三种,分别是 ​ 1.Local/Embedded Metastore Database (Derby) ​ 2.Remote Meta ...

  7. C++第三次作业--作用域

    作用域 任何一种语言最基本的部分就是变量,而变量有两个非常重要的特性,作用域和生存期. 定义 作用域是变量的一个属性,某个变量在代码中有效的区域为该变量的作用域. 函数原型作用域 函数声明参数从参数声 ...

  8. [AWS - EC2] 如何向 Amazon Linux 2 实例传输文件,下载文件。How to send/ download files from Amazon Linux 2 Instance

    1. 需要: 安装 WinSCP 2. 需要: PuTTY 生成的ppk格式密钥, 没有的话请移步此文章,完成1, 2, 3步即可. 3. 打开 WinSCP , 如果提示已经有PuTTY配置是否导入 ...

  9. 【javascript】[].slice.call(arguments)的作用

    var thisExtends = function () { var args = [].slice.call(arguments).filter(function (item) { return ...

  10. SAP笔记

    1,负数的表示增强 负号从数字后更改到数字前面 适用于字符型字段: CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT' CHANGING VALUE = gt_table-c ...