首先回顾下成员变量

通过对象名能够访问public成员变量

每个对象的成员变量都是专属

成员变量不能在对象之间共享

再来讲讲类的静态成员变量

介绍

  • 静态成员变量属于整个类所有
  • 静态成员变量的生命期不依赖于任何对象(如同全局变量)
  • 可以通过类名直接访问公有(public)静态成员变量
  • 所有对象共享类的静态成员变量
  • 可以通过对象名访问公有(public)静态成员变量

特性

  • 在类里定义时直接通过static关键字修饰
  • 静态成员变量需要在类外单独分配空间
  • 静态成员变量在程序内部位于全局数据区

例如:

class Test{

public:
static int cnt; //static修饰,告诉编译器在Test类里有个静态成员变量cnt }; int Test::cnt = 1; //在类外初始化,若不赋值则默认置0,写为:int Test::cnt;
int main()
{
Test::cnt = 100; //设置公有静态成员变量cnt=100
printf("cnt:%d\n",Test::cnt);
return 0;
}

如果static成员时const类型,则可以直接在类内部初始化赋值

例如:

class Test{

public:
const static int cnt = ; //类内部初始化 }; int main()
{
printf("cnt:%d\n",Test::cnt);
return ;
}

接下来做一个小实例

在程序运行时, 可以随时查询到某个类的对象的个数

保证程序的安全,不能使用全局变量

代码如下:

#include "stdio.h"

class Test{

private:
static int cnt; public:
Test()
{
cnt++;
}
~Test()
{
cnt--;
}
int getCNT()
{
return cnt;
}
}; int Test::cnt = 0; //在类外赋值,使其分配空间 int main()
{
Test t1;
Test t2;
Test *t3; printf("count:%d\n",t1.getCNT());
printf("count:%d\n",t2.getCNT()); t3= new Test;
printf("count:%d\n",t1.getCNT()); delete t3;
printf("count:%d\n",t1.getCNT()); return 0;
} 

运行打印:

count:2
count:2
count:3
count:2

运行后,可以发现已经能够统计对象个数了.

但是还有缺点,调用这个getCNT()函数时,前提还要有个对象才行.

假如程序里没有对象了,就根本无法查询到count值.

所以我们还需要使用类的静态成员函数来完善它

静态成员函数

介绍

  • 静态成员函数属于整个类所有
  • 静态成员函数没有隐含this指针,无法直接访问非静态成员变量
  • 可以通过类名对象名访问公有静态成员函数

静态成员函数定义和成员函数类似,唯一区别是,在类里定义时需要在前面加static关键字

例如:

class Test{

public:
static int func() { //定义func静态成员函数
//... ...
return 0;
}
}

或者:

class Test{

public:
static int func(); //定义func静态成员函数 } int Test::func()
{
//... ...
return 0;
}

  

接下来完善上面实例,使用静态成员函数获取统计个数

#include "stdio.h"

class Test{
private:
static int cnt;
public:
Test()
{
cnt++;
} ~Test()
{
cnt--;
} static int getCNT()
{
return cnt;
}
}; int Test::cnt = ; //在类外赋值,使其分配空间 int main()
{
printf("count:%d\n",Test::getCNT());
Test t1;
Test t2;
Test *t3;
printf("count:%d\n",Test::getCNT()); t3= new Test;
printf("count:%d\n",Test::getCNT()); delete t3;
printf("count:%d\n",Test::getCNT());
return ;
}

运行打印:

count:0
count:2
count:3
count:2

  

13.C++-静态成员变量、静态成员函数的更多相关文章

  1. c++——静态成员变量成员函数

    静态成员变量成员函数 思考:每个变量,拥有属性.有没有一些属性,归所有对象拥有? 4.1静态成员变量 1)定义静态成员变量 关键字 static 可以用于说明一个类的成员, 静态成员提供了一个同类对象 ...

  2. c++,static 静态成员变量 / 静态成员函数

    静态成员变量: //静态成员变量(static) // //1.如果想在同类的多个对象之间实现数据共享 ,可以用静态 //成员变量,即用static修饰的成员变量,例 static int a; // ...

  3. c++中静态成员变量 静态成员函数 全局变量与静态函数的关系 字符串中括号的匹配编程 (笔试经历)

    笔试经历 1 类中的静态变量不能通过构造函数参数列表来初始化,因为静态变量不属于哪个对象.同时静态变量在不初始化的情况下系统会自动为变量赋值,数值型赋值为零,字符型赋值为空. 非静态变量只有在定义时才 ...

  4. C++@类的静态成员变量和静态成员函数

    参考: http://blog.csdn.net/morewindows/article/details/6721430 http://www.cnblogs.com/lzjsky/archive/2 ...

  5. C++静态成员函数不能调用非静态成员变量

    其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话因为无论是静态成员函数还是静态成员变量,它们 都是在类的范畴之类的,及在类的整个生存周期里始终只能存在一份.然而非静态成员变量和非 ...

  6. static 关键字 静态成员变量及静态成员函数

    static类成员 类成员类似于C语言的全局变量,但是与全局变量又有所不同,例如,全局变量是可以被任何的用户代码所修改,而且全局变量破坏了对象的封装性. 使用类的 static 成员的优点 使用 st ...

  7. C++解析(14):静态成员变量与静态成员函数

    0.目录 1.静态成员变量 2.静态成员函数 3.小结 1.静态成员变量 成员变量的回顾: 通过对象名能够访问public成员变量 每个对象的成员变量都是专属的 成员变量不能在对象之间共享 新的需求: ...

  8. c++ 静态成员变量

    在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节 ...

  9. JAVA非静态成员变量之死循环

    1.非静态成员变量 当成员变量为非静态成员变量且对当前类进行实例化时,将会产生死循环 例子: public class ConstructorCls { private ConstructorCls ...

随机推荐

  1. Codeforces 257D

    题意略. 思路:这个题目最重要的是那个不等式 a[i] <= a[i+1] <= 2 * a[i]  ,你会发现0 <= a[i+1]  -  a[i] <= a[i],令x ...

  2. 打造SpringBootTemplate(SpringBoot项目的模版)

    随着框架使用的不断的更新,后面使用SpringBoot会多,这边准备构建一个SpringBoot项目使用的模版. 所谓模版,和之前一样,就是一个最简单的项目,包含所有最简单的空实现. 做模版的时候参考 ...

  3. [Note] Stream Computing

    Stream Computing 概念对比 静态数据和流数据 静态数据,例如数据仓库中存放的大量历史数据,特点是不会发生更新,可以利用数据挖掘技术和 OLAP(On-Line Analytical P ...

  4. 故障定位之查找附近点GeoHash研讨

    随着移动终端的普及,很多应用都基于LBS功能,附近的某某(餐馆.银行.妹纸等等). 基础数据中,一般保存了目标位置的经纬度:利用用户提供的经纬度,进行对比,从而获得是否在附近. 目标:查找附近的XXX ...

  5. Hbase多列范围查找(效率)

    Hbase索引表的结构 Hbase Rowkey 设计 Hbase Filter Hbase二级索引 Hbase索引表的结构 在HBase中,表格的Rowkey按照字典排序,Region按照RowKe ...

  6. linux RHCS集群 高可用web服务器

    RHCS集群,高可用服务器 高可用 红帽集群套件,提供高可用性,高可靠性,负载均衡,快速的从一个节点切换到另一个节点(最多16个节点)负载均衡 通过lvs提供负载均衡,lvs将负载通过负载分配策略,将 ...

  7. asp.mvc中的vue分页实例,分页组件无法重置reload,解决点击查询按钮后,分页不刷新的问题

    刚刚接触Vue.js,现在需要做一个查询功能,并且进行服务端分页.主要思路是在页面中注册一个分页组件,然后进行调用.代码如下 1.引用vue.js,具体去网上下载 2.在html的body中添加如下代 ...

  8. NLP+语义分析(四)︱中文语义分析研究现状(CIPS2016、角色标注、篇章分析)

    摘录自:CIPS2016 中文信息处理报告<第二章 语义分析研究进展. 现状及趋势>P14 CIPS2016> 中文信息处理报告下载链接:http://cips-upload.bj. ...

  9. Java之List排序

    1.Java封装类 Student.java: /** * @Title:Student.java * @Package:com.you.data * @Description: * @Author: ...

  10. Linux显示用户注册名

    Linux显示用户注册名 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ finger -s Login Name Tty Idle Login Time Of ...