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后台验证码不显示解决方法详解(dedecms 5.7)
今天朋友问我他本地与服务器上安装了dedecms5.7无法显示验证码,一般这种情况很少见,一般情况就是服务器设置问题,还有临时目录的权限问题 Dede后台验证码不显示或不正常分三种情况,下面来逐一分析 ...
- Eclipse 安装Groovy插件
摘自: http://blog.csdn.net/boonya/article/details/45399901 步骤一: 下载eclipse4.3.0,地址:http://www.eclipse.o ...
- 支持在安卓中UI(View)的刷新功能
这是一款可以支持在安卓中UI(View)的刷新功能,Android中对View的更新有很多种方式,使用时要区分不同的应用场合.我感觉最要紧的是分清:多线程和双缓冲的使用情况. 现在可以尝试理解下 ...
- C#关于一个程序,只可以有一种实例的方法
方法一:使用线程互斥变量. 通过定义互斥变量来判断是否已运行实例.把program.cs文件里的Main()函数改为如下代码: 说明:程序中通过语句 System.Threading.Mutex ru ...
- 导出数据库数据制成Excel和txt
引用ICSharpCode.SharpZipLib.dll 1.编写压缩和解压代码 using System; using System.Collections.Generic; using Syst ...
- c#使用DocX给word添加目录TOC
刚要做目录的时候,我就想DocX应该提供了这个方面的函数.于是我就在讨论区搜索,看看别人是怎么用的. 我搜索了catalog; catalogue; list; contents;,但是都没有和目录有 ...
- CentOS 下如何查看并清理系统内存空间
有时候在服务器上打开了很多会占用内存的程序但关闭这些程序后,发现内存空间还是和没有关闭应用程序时的占用一样,以致使其它应用程序打开时内存不够或很卡,那么此时就想清理掉以前的程序打开时所占用的内存.而大 ...
- 个性化修改Linux登录时的字符界面
如果采用root账号登录编辑/etc/bashrc内容,那所有其他帐号登录都会提示相同的内容,如果想每个用户进行配置,那就去每个帐号的目录下去配置吧. 这里提供改一个文件所有帐号都能看到的个性显示内容 ...
- js控制文本框只能输入数字 及 常用字符对应ASCII码值
方法一: <INPUT TYPE='text' NAME=text onkeypress="a()"><script language=javascript> ...
- sliding windows (poj 2823) 题解
[问题描述] 给你一个长度为N的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右移动一位,如下表: [样例输入] 8 3 1 3 -1 -3 5 3 6 7 [样例输 ...