首先回顾下成员变量

通过对象名能够访问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. GCC精彩之旅_1

    说明: 本文共两篇,转自GCC精彩之旅.第一篇着重介绍GCC编译一个程序的过程与优化,第二篇侧重在GCC结合GDB对代码的调试. 在为Linux开发应用程序时,绝大多数情况下使用的都是C语言,因此几乎 ...

  2. FFMpeg首次使用

    FFMpeg在Windows上的使用.去FFMpeg官网上去下载文件. 把下载好的文件放如下图所示的位置. cmd,调出系统的命令行工具.首先进入d盘. 进入到ffmpeg所在的文件夹. 运行 ffm ...

  3. MysqL 磁盘写入策略之innodb_flush_log_at_trx_commit

    本文从参数含义,性能,安全角度阐述两个参数为不同的值时对db 性能,数据的影响,引擎是Innodb的前提下. 取值:0/1/2 innodb_flush_log_at_trx_commit=0,表示每 ...

  4. Mac下VirtualBox共享文件夹设置

    环境:CentOS7.2最小化安装 步骤: 先安装必要软件包 yum install -y gcc gcc-devel gcc-c++ gcc-c++-devel make kernel kernel ...

  5. UVA - 247 Calling Circles Floyd判圈

    思路:利用的Floyd判圈,如果i能到j,j也能到i说明i和j在同一个圈里.每个人的名字可用map编号.最后DFS打印答案即可. AC代码 #include <cstdio> #inclu ...

  6. nyoj44 子串和 线性DP

    线性DP经典题. dp[i]表示以i为结尾最大连续和,状态转移方程dp[i] = max (a[i] , dp[i - 1] + a[i]) AC代码: #include<cstdio> ...

  7. 修改或隐藏Nginx的版本号

    隐藏版本号 隐藏nginx的版本号很简单,nginx的HttpCoreModule提供了一条叫做server_tokens指令,我这要将这条指令设置为“server_tokens off”就可以了. ...

  8. 决策树系列(三)——ID3

    预备知识:决策树 初识ID3 回顾决策树的基本知识,其构建过程主要有下述三个重要的问题: (1)数据是怎么分裂的 (2)如何选择分类的属性 (3)什么时候停止分裂 从上述三个问题出发,以实际的例子对I ...

  9. Duplicate entry '0' for key 'PRIMARY'的一种可能的解决办法

    在MySQL设计好数据库往往数据库中插入数据的时候, 因为主键ID默认是不赋值的,只给其他项目赋值了,相关的SQL代码是这样的 StringBuilder strSql = new StringBui ...

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

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