13.C++-静态成员变量、静态成员函数
首先回顾下成员变量
能通过对象名能够访问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++-静态成员变量、静态成员函数的更多相关文章
- c++——静态成员变量成员函数
静态成员变量成员函数 思考:每个变量,拥有属性.有没有一些属性,归所有对象拥有? 4.1静态成员变量 1)定义静态成员变量 关键字 static 可以用于说明一个类的成员, 静态成员提供了一个同类对象 ...
- c++,static 静态成员变量 / 静态成员函数
静态成员变量: //静态成员变量(static) // //1.如果想在同类的多个对象之间实现数据共享 ,可以用静态 //成员变量,即用static修饰的成员变量,例 static int a; // ...
- c++中静态成员变量 静态成员函数 全局变量与静态函数的关系 字符串中括号的匹配编程 (笔试经历)
笔试经历 1 类中的静态变量不能通过构造函数参数列表来初始化,因为静态变量不属于哪个对象.同时静态变量在不初始化的情况下系统会自动为变量赋值,数值型赋值为零,字符型赋值为空. 非静态变量只有在定义时才 ...
- C++@类的静态成员变量和静态成员函数
参考: http://blog.csdn.net/morewindows/article/details/6721430 http://www.cnblogs.com/lzjsky/archive/2 ...
- C++静态成员函数不能调用非静态成员变量
其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话因为无论是静态成员函数还是静态成员变量,它们 都是在类的范畴之类的,及在类的整个生存周期里始终只能存在一份.然而非静态成员变量和非 ...
- static 关键字 静态成员变量及静态成员函数
static类成员 类成员类似于C语言的全局变量,但是与全局变量又有所不同,例如,全局变量是可以被任何的用户代码所修改,而且全局变量破坏了对象的封装性. 使用类的 static 成员的优点 使用 st ...
- C++解析(14):静态成员变量与静态成员函数
0.目录 1.静态成员变量 2.静态成员函数 3.小结 1.静态成员变量 成员变量的回顾: 通过对象名能够访问public成员变量 每个对象的成员变量都是专属的 成员变量不能在对象之间共享 新的需求: ...
- c++ 静态成员变量
在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节 ...
- JAVA非静态成员变量之死循环
1.非静态成员变量 当成员变量为非静态成员变量且对当前类进行实例化时,将会产生死循环 例子: public class ConstructorCls { private ConstructorCls ...
随机推荐
- 对网站视频资源的管控-禁止通过视频的url访问视频
一般静态文件的下载是不经过PHP的,直接由web服务器发送到客户端.但有时候需要实现文件下载的权限控制等功能,这时候就需要经由PHP程序来做权限验证.简单粗暴的做法是,在PHP程序里边先验证权限,验证 ...
- 震撼功能:逐浪CMS全面支持PWA移动生成意指未来
Progressive Web App, 简称 PWA,是提升 Web App 的体验的一种新方法,能给用户原生应用的体验. PWA 能做到原生应用的体验不是靠特指某一项技术,而是经过应用一些新技术进 ...
- Oauth认证协议
原文地址腾讯QQ第三方登录的实现原理? Oauth当中的角色: 1.Service Provider(服务提供方): 服务提供方通常是网站,在这些网站当中存储着一些受限制的资源,如照片.视频.联系人列 ...
- Minikube之Win10单机部署
Kubernetes(k8s)是自动化容器操作的开源平台,基于这个平台,你可以进行容器部署,资源调度和集群扩容等操作.如果你曾经用过Docker部署容器,那么可以将Docker看成Kubernetes ...
- MongoDB的DBREF 使用.
首先要记一下根据 DBREF 的ObjectId 以及根据 ref 集合为条件查询问题. 在不同的可视化客户端里面显示的问题. //某客户端显示这样,直接CMD查询也是这样显示.这样我无法看懂find ...
- Storm+HBase实时实践
1.HBase Increment计数器 hbase counter的原理: read+count+write,正好完成,就是讲key的value读出,若存在,则完成累加,再写入,若不存在,则按&qu ...
- 【前端】Vue2全家桶案例《看漫画》之六、图片阅读页
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_6.html 项目github地址:https://github.com/shamoyuu/ ...
- R+openNLP︱openNLP的六大可实现功能及其在R语言中的应用
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- openNLP是NLP中比较好的开源工具,R语 ...
- mysql常用基础操作语法(十)~~子查询【命令行模式】
mysql中虽然有连接查询实现多表连接查询,但是连接查询的性能很差,因此便出现了子查询. 1.理论上,子查询可以出现在查询语句的任何位置,但实际应用中多出现在from后和where后.出现在from后 ...
- 系统架构以及需要导入的jar包
架构: Servlet +JSP +JavaBean +JDBC 需要导入的jar包: MYSQL: 数据库驱动 C3PO连接池: (这个需要配置文件) C3PO DBUtils:特点:轻量级首选,增 ...