首先回顾下成员变量

通过对象名能够访问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. java1环境与简介

    java1环境与简介   Ⅰ 个人简介 陈鹏 联系方式:15828682774 2012 年至今,从事软件开发 5 年. 1 年新加坡海外工作经历. 先后在民企.外企.创业公司做过开发. 熟悉 JAV ...

  2. yii2自带的backend,frontend不够用,添加一个后台模块怎么做?

    在复杂项目里,高级模板中的fontend.backend application明显不够,可以再添加另外的application. 例如添加一个seller application .步骤如下: 1, ...

  3. HDU - 3085 双向BFS + 技巧处理 [kuangbin带你飞]专题二

    题意:有两只鬼,一个男孩女孩被困在迷宫中,男孩每秒可以走三步,女孩只能1步,鬼可以两步且可以通过墙.问男孩女孩是否可以在鬼抓住他们之前会合? 注意:每秒开始鬼先移动,然后两人开始移动. 思路:以男孩和 ...

  4. 学web前端开发有前途吗

    web前端开发现在如此火爆,可以说是引领了IT培训行业的一个潮流,那么web前端开发都要学些什么知识呢?为什么这么火有前途吗?现在行业很需要这种人才吗?还是大家盲目跟风,随大流,下面小编对web前端做 ...

  5. HighCharts之2D半圆环图

    HighCharts之2D半圆环图 1.实例源码 HalfDonut.html: <!DOCTYPE html> <html> <head> <meta ch ...

  6. JavaScript向select下拉框中添加和删除元素

    JavaScript向select下拉框中添加和删除元素 1.说明 a   利用append()方法向下拉框中添加元素 b   利用remove()方法移除下拉框中最后一个元素 2.设计源码 < ...

  7. hihocoder Challenge 29 B.快速乘法

    这题的题解和我写的有一拼,异常简洁,爆炸. 这题思路dp 表示的是讨论到第位,并比原数的前n位多了 显然j只能取0,1,毕竟2进制嘛 之后转移就好了,注意下面两个重要状态 #include <c ...

  8. Java并发系列[7]----CountDownLatch源码分析

    CountDownLatch(闭锁)是一个很有用的工具类,利用它我们可以拦截一个或多个线程使其在某个条件成熟后再执行.它的内部提供了一个计数器,在构造闭锁时必须指定计数器的初始值,且计数器的初始值必须 ...

  9. java类型转换详解(自动转换和强制转换)

    自动转换 class Hello { public static void main(String[] args) { //自动转换 int a = 5; byte b = 6; int c = a ...

  10. @SuppressWarnings("unchecked")(解决标准的后台HttpServletRequest request, HttpServletResponse response)格式

    在springmvc的应用中有些限制会出现必须是 public void save(HttpServletRequest request, HttpServletResponse response) ...