• 学习交流加(可免费帮忙下载CSDN资源):
  • 个人微信: liu1126137994
  • 学习交流资源分享qq群1(已满): 962535112
  • 学习交流资源分享qq群2: 780902027

以一个简单的例子来引入C++中类的静态成员变量!

假入客户给你提了一个需求:

  • 统计在程序运行期间某个类的对象的数目
  • 保证程序的安全性(不能使用全局变量)
  • 随时可以获取当前对象的数目

你或许会想到用类的成员变量来做计数值。写出的代码可能类似下面的代码:

#include <stdio.h>class Test
{private:int mCount;
public:Test() : mCount(0){mCount++;}~Test(){--mCount;}int getCount(){return mCount;}
};Test gTest;  //一个全局对象int main()
{Test t1;  //局部对象Test t2;   //局部对象printf("count = %d\n", gTest.getCount());printf("count = %d\n", t1.getCount());printf("count = %d\n", t2.getCount());return 0;
}

上面简单的代码用成员变量mCount作为计数值,在拷贝构造函数与析构函数中分别作自加与自减运算,看似当生成一个对象时,它的值就会加1,这样通过获取它的值就可以得知对象的数目。将代码放到linux下运行编译输出结果为:

count = 1
count = 1
count = 1

为什么跟我们预想的不一样呢?因为每个对象的成员变量都是每个对象专属的,我定义了三个对象,那么我这三个对象的成员变量都是自己专属的,其他对象的生成不会影响另一个对象的成员变量,而是调用该对象自己的成员变量,所以最终输出结果为三个1.

下面我们把计数值改为一个全局变量,试试看会出现什么结果呢?

#include <stdio.h>int gCount;
class Test
{private:int mCount;
public:Test() : mCount(0){gCount++;}~Test(){--gCount;}int getCount(){return gCount;}
};Test gTest;  //一个全局对象int main()
{Test t1;  //局部对象Test t2;   //局部对象printf("count = %d\n", gTest.getCount());printf("count = %d\n", t1.getCount());printf("count = %d\n", t2.getCount());return 0;
}

这个时候的输出结果为:

count = 3
count = 3
count = 3

好,至少我们达到了第一步,实现了这个功能!但是呢,用户是有要求的,不能使用全局变量。因为全局变量在当代软件开发过程中是不受欢迎的,它是不够安全的!!!所以我们还是得想其他办法:普通成员变量无法满足,全局变量可以满足,综合他们两,我们可以用静态的成员变量!静态成员变量在文件内是全局属性的。在C++中我们可以定义静态成员变量:

  • 静态成员变量属于整个类所有
  • 静态成员的生命周期不依赖于任何对象(程序包运行的整个周期)
  • 可以通过类名直接访问共有静态成员变量
  • 所有对象共享类的静态成员变量
  • 可以通过对象名访问公有静态成员变量

下面还是直接上代码分析比较直接:

#include <stdio.h>class Test
{private:static int cCount;
public:Test(){cCount++;}~Test(){--cCount;}int getCount(){return cCount;}
};int Test::cCount = 0;   //这里是为什么?Test gTest;int main()
{Test t1;Test t2;printf("count = %d\n", gTest.getCount());printf("count = %d\n", t1.getCount());printf("count = %d\n", t2.getCount());Test* pt = new Test();    //发生了什么?printf("count = %d\n", pt->getCount());delete pt;                //发生了什么?printf("count = %d\n", gTest.getCount());return 0;
}

输出结果为:

count = 3
count = 3
count = 3
count = 4
count = 3

下面我们来分析代码:这里static int cCount;定义的是一个静态成员变量,因为静态全局变量隶属于整个类所有,不隶属于某一个成对象,所以我们需要在类外单独给它分配空间,它位于全局数据区!!!这样在全局数据区给静态成员变量分配空间int Test::cCount = 0;

而这一段代码: Test* pt = new Test(); Test* pt = new Test();这里我们定义一个指针对象指向一个堆空间,那么它就会调用拷贝 构造函数使得cCount加1,delete pt;调用析构函数,使得cCount减1。

由以上分析得出静态成员变量的几条特性:

  • 在定义时直接通过static关键字修饰
  • 静态成员变量需要在类外单独分配空间
  • 静态成员变量在程序内部位于全局数据区(但是文件间无法共享)

单独分配空间的语法规则:
Type ClassName::VarName = value;

【C++深度剖析教程3】C++中类的静态成员变量相关推荐

  1. 【C++深度剖析教程5】C++中类的静态成员函数

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2(已满): 780902027 学习 ...

  2. 【C++深度剖析教程39】实现C++数组类模板

    上一篇文章在那个学习了多参数类模板与特化的分析:点击链接查看上一篇文章:类模板深度剖析 本篇文章学习记录: 数值型模板参数 实现C++数组类模板 1.模板中的数值型参数 模板参数可以是数值型参数.也就 ...

  3. 【C++深度剖析教程38】类模板深度剖析

    加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 1.多参数类模板 类模板可以定义任意多个不同的类型参数 类模板可以被特化: 指定类模板的特定实现 部分类型参数必须 ...

  4. 【C++深度剖析教程25】继承中的构造与析构

    今天来学习C++中继承的构造与析构,有兴趣一起学习的加qq:1126137994 1.问题 如何初始化父类成员?父类构造函数与子类构造函数有什么关系? 子类对象是如何构造的? 子类中可以定义构造函数 ...

  5. 【C++深度剖析教程22】继承的概念和意义

    今天我们来学习C++中的继承的概念和意义. 一.类之间的组合关系 问题:类之间是否存在直接的关联关系? 回答:类之间存在组合的关系,整体与部分的关系. 可以看一下生活中的例子: 下面我们以一个简单的程 ...

  6. 【C++深度剖析教程8】C++的操作符重载的概念

    之前学习了类的函数重载的概念,今天学习操作符重载的概念.在这之前我们先看一个例子: 上面是一个复数的加法,a为复数的实部,b为复数的虚部,在main函数里我想实现复数c1与c2的加法.很显然,正常的+ ...

  7. 【C++深度剖析教程7】C++之类中的函数重载

    函数重载的回顾(接上一篇文章): 函数重载的本质为相互独立的不同的函数 C++中通过函数名和函数参数确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的成员 ...

  8. 【C++深度剖析教程40】使用数值型模板技术计算1+2+3+...+N的值

    上一篇文章学习了数值型模板技术,并利用相关技术,实现了C++的数组类模板.点击文章查看上一篇文章:点击链接查看 本篇文章,继续利用模板技术来解决一个问题. 如果想求1+2+3+-+N的结果,有很多种方 ...

  9. 【C++深度剖析教程37】类模板的概念和意义

    加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 1.类模板 一些类主要用于存储和组织数据元素 类中数据的组织方式和数据元素的具体类型无关 如 数组类,链表类,st ...

最新文章

  1. nodejs ld linux.so,请教大神,如何在独立虚拟主机上配置node.js开发环境?
  2. 算法----------字符串相乘(Java 版本)
  3. 使用SharePoint 2007 Web Service上传文件到文档库
  4. 【数据结构-图】1.图的构造和遍历(基本理论+代码)
  5. NHibernate 学习总结 开篇
  6. Spring Cloud Sleuth 中id的使用
  7. iOS 学习之NSPredicate
  8. oracle having(),Oracle HAVING子句
  9. Maven 中央仓库及阿里云仓库地址
  10. 小鹏汽车9月总交付10412台 成为新造车势力中第一家月交付过万的企业
  11. TSDF算法笔记(转)
  12. Using Cobbler Web Interface
  13. 运行make_datafiles的过程
  14. 详解:Oracle数据库介绍 、字符、类型、语言
  15. 背景图片,颜色变化脚本
  16. 记录一个php用curl方法post一个api的过程multipart/form-data,php的json对象转数组,php数组转json格式
  17. javascript 倒计时插件
  18. 搜狐CEO张朝阳:不想把成功交给一种可能
  19. 谷歌chrome浏览器怎么导出打包扩展程序crx
  20. Tcp/IP 端口耗尽

热门文章

  1. 17. 框架标签及其应用实例
  2. sqlserver:(2):window下SQL server数据库数据源的配置
  3. 玩转oracle 11g(46):图解oracle数据库
  4. JS之数组元素排序方法sort
  5. python网络编程知识点_python 网络编程要点
  6. action请求是什么意思_凭什么说大疆Osmo Action可以干掉 GoPro hero7?
  7. angular - 如何运行在起来 - 使用nginx
  8. Robotium_断言方法assert、is、search
  9. 今天刚开通博客,很开心
  10. Bootstrap中过渡效果(Transition)模态框插件的使用案例