c++ 中static关键字
static可以用于修饰普通的变量和函数,也可以用于修饰类的成员
- 普通应用
1.修饰普通变量
修饰全局变量:将变量的作用域限制在所属文件
修饰局部变量:将变量的生存周期延迟到程序结束
2.修饰普通函数
将函数的作用域限制在所属文件
- 在类中应用
被static修饰的类的成员被类的所有对象共享,不属于某个具体对象,普通的类的成员都有this指针指向本对象,而static修饰的成员不属于特定对象因此没有this指针。
1.修饰类的数据成员
在类中声明,在类外定义。定义方式 <类名::变量名=值 >这样做是有原因的,因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。
特例:当被static修饰的数据成员具有const关键字时需要在类中初始化,但仍需在类外定义
2.修饰数据成员
因为static成员函数不具有this指针,所以不能访问非静态成员。
static 成员函数访问方式
- (.)和(->)
- <类名>::<静态成员函数名>(<参数表>)
其他:
- 未经初始化的静态全局变量会被程序自动初始化为0
- static变量只在第一调用时初始化一次,之后不再初始化(只能赋值)
int SetValue(int a)
{
static int v=a; //执行一次,初始化为a
return v;
}
int main()
{
cout << SetValue() << " " << SetValue()<<endl;
}
结果:
static int v=a;只初始化一次,这一步只有在第一次调用的时候执行
对应的:
int SetValue(int a)
{
static int v; //执行一次,初始化为0
v= a; //赋值操作
return v;
}
int main()
{
cout << SetValue() << " " << SetValue()<<endl;
}
结果:
- 函数内部声明的static变量,可作为对象间的一种通信机制,局部变量被声明为static,那么将只有唯一的一个静态分配的对象,它被用于在该函数的所有调用中表示这个变量。这个对象将只在执行线程第一次到达它的定义时初始化。
const int& SetValue(int a)
{
static int v;
v=a;
return v;
}
int main()
{
cout << SetValue() << " " << SetValue()<<endl;
if (SetValue() == SetValue())
cout << "yes" << endl;
else
cout << "no" << endl;
}
结果:
由结果可知SetValue(1)和SetValue(2)确实都改变了v的值,但第十行却出现了SetValue(1)==SetValue(2),这是因为返回值是reference,都是指向SetValue内部的static v,也就是说调用端看到的都是static v的“现值”。
对应的:
const int& SetValue(int a)
{
static int v;
v=a;
return v;
}
int main()
{
cout << SetValue() << " " << SetValue()<<endl;
int a = SetValue();
int b = SetValue();
if (a == b)
cout << "yes" << endl;
else
cout << "no" << endl;
结果:
- 保持变量内容的持久,位于函数内的静态局部变量会在下一次调用之前保持上一次调用后的值。
c++ 中static关键字的更多相关文章
- java中static关键字的作用
java中static关键字主要有两种作用: 第一:为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关. 第二,实现某个方法或属性与类而不是对象关联在一起 简单来说,在Java语言中,s ...
- c++中static关键字的用法总结
类中的静态成员真是个让人爱恨交加的特性.我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动. 静态类成员包括静态数据成员和静态函数成员两部分. 一 静态数据成员: 类体中 ...
- [java基础]java中static关键字
1.static概念 static是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序 ...
- C/C++中static关键字详解
静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值. 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见.用法1:函数内部声明 ...
- C/C++中static关键字详解-zz
静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值. 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见.用法1:函数内部声明 ...
- (转)C/C++中static关键字
下面的转自http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777441.html 静态变量作用范围在一个文件内,程序开始时分配空间,结束 ...
- java中static关键字解析
static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列 ...
- C/C++中static关键字的用法
1.什么是static? static 是C/C++中很常用的修饰符,它被用来控制变量的存储方式和可见性. 1.1static的引入 我们知道在函数内部定义的变量,当程序执行到它的定义处时,编译器为它 ...
- Java中static关键字的详解
static关键字可以修饰方法和成员变量(不可以修饰局部变量,但是可以修饰内部类). static关键字方便在没有创建对象的情况下来进行调用(方法/变量). 很显然,被static关键字修饰的方法或者 ...
- C#学习笔记随笔(1)----C#中static关键字的作用
静态分配的,有两种情况: 1. 用在类里的属性.方法前面,这样的静态属性与方法不需要创建实例就能访问, 通过类名或对象名都能访问它,静态属性.方法只有“一份”:即如果一个类新建有N个 对象,这N 个对 ...
随机推荐
- DEDE的data目录名称修改方法
DEDE的data目录名称修改方法 为了最大限度的减少网站被攻击的可能,需要将data目录改名,具体操作如下: 1.修改include目录下的common.inc.php这个文件.打开文件,找到第16 ...
- 如何利用jq来实现复选框的全选,反选!
$("document").ready(function(){ $("#btn1").click(function(){ $("[name='chec ...
- Linux之磁盘管理
本章重点提示: 1):理解基础命令,df,fdisk. 2):磁盘分区的理论基础. 1:查看当前系统分区与挂载情况: [root@localhost ~]# df Filesystem 1K-bloc ...
- javaSE27天学习目录
第一阶段(java基础知识) 计算机基础知识 Java开发环境的搭建和应用 机制转换 有符号数据表示法(原码.反码.补码) Java语句基础(关键字.标识符.注释.常量.变量.数据类型.运算符) ...
- Jquery 利用单个复选款(checkbox)实现全选、反选
1 <script type="text/javascript"> $(function(){ //全选 $("#CheckedAll").clic ...
- PeopleCode 处理压缩文件
PeopleSoft中对文件附件的处理都是单个文件处理的,虽然在8.52版本新增了MAddAttachment(URLDestination, DirAndFilePrefix, Prompts, ...
- SQL中迁移sql用户及密码脚本
SQL中迁移sql用户及密码脚本 编写人:CC阿爸 2014-6-20 在日常SQL数据库的操作中,常常需要迁移数据库或重装服务器,这时候,一些之前建立的login账户,必须重新建立,以下可以通过 ...
- JS模块化工具requirejs教程(二):基本知识
基本API require会定义三个变量:define,require,requirejs,其中require === requirejs,一般使用require更简短 define 从名字就可以看出 ...
- Lambda Grinding Miller From Zenith
data = """ The Basic Things About Grinding Mill A grinding mill is a unit operation d ...
- mysql 根据生日计算年龄,并查询在18-25之间的语句
select id, DATE_FORMAT(birthday,"%Y-%m-%d") birthday, CURDATE() , (year(now())-year(birthd ...