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关键字的更多相关文章

  1. java中static关键字的作用

    java中static关键字主要有两种作用: 第一:为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关. 第二,实现某个方法或属性与类而不是对象关联在一起 简单来说,在Java语言中,s ...

  2. c++中static关键字的用法总结

    类中的静态成员真是个让人爱恨交加的特性.我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动. 静态类成员包括静态数据成员和静态函数成员两部分. 一 静态数据成员: 类体中 ...

  3. [java基础]java中static关键字

    1.static概念 static是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序 ...

  4. C/C++中static关键字详解

    静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值. 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见.用法1:函数内部声明 ...

  5. C/C++中static关键字详解-zz

    静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值. 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见.用法1:函数内部声明 ...

  6. (转)C/C++中static关键字

    下面的转自http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777441.html 静态变量作用范围在一个文件内,程序开始时分配空间,结束 ...

  7. java中static关键字解析

    static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列 ...

  8. C/C++中static关键字的用法

    1.什么是static? static 是C/C++中很常用的修饰符,它被用来控制变量的存储方式和可见性. 1.1static的引入 我们知道在函数内部定义的变量,当程序执行到它的定义处时,编译器为它 ...

  9. Java中static关键字的详解

    static关键字可以修饰方法和成员变量(不可以修饰局部变量,但是可以修饰内部类). static关键字方便在没有创建对象的情况下来进行调用(方法/变量). 很显然,被static关键字修饰的方法或者 ...

  10. C#学习笔记随笔(1)----C#中static关键字的作用

    静态分配的,有两种情况: 1. 用在类里的属性.方法前面,这样的静态属性与方法不需要创建实例就能访问, 通过类名或对象名都能访问它,静态属性.方法只有“一份”:即如果一个类新建有N个 对象,这N 个对 ...

随机推荐

  1. 【MySQL】frm文件解析

    官网说明:http://dev.mysql.com/doc/internals/en/frm-file-format.html frm是MySQL表结构定义文件,通常frm文件是不会损坏的,但是如果出 ...

  2. 苹果系列机型专业刷机,解锁,解ID

    如有软件开发需求,请留言或在猪八戒网主页留言http://home.zhubajie.com/8506525/,常年接收c.c++(vs2010.RAD studio xe5\RAD studio 2 ...

  3. php5.3 连接 sqlserver2005

    操作系统:XP php5.3以后,已经不对sqlserver支持连接扩展了,不过微软官方还是对php5.3以后进行了扩展解决方案. 1.确认要连接sqlserver的数据库版本为2005 2.确认ph ...

  4. Jquery设置select控件指定text的值为选中项

    <select name="streetid" id="streetid"> <option value="4">北 ...

  5. [转载]《C++0x漫谈》系列之:多线程内存模型

    <C++0x漫谈>系列之:多线程内存模型 By 刘未鹏(pongba) 刘言|C++的罗浮宫(http://blog.csdn.net/pongba) <C++0x漫谈>系列导 ...

  6. DPDK多核多线程机制简析

    DPDK通过在多核设备上,创建多个线程,每个线程绑定到单独的核上,减少线程调度的开销,以提高性能. DPDK的线程分为控制线程和数据线程,控制线程一般绑定到MASTER核上,主要是接受用户配置,并传递 ...

  7. 小菜的系统框架界面设计-数据的完美呈现(DataGridView扩展)

    背景 今天在做系统报表的过程中,我想实现批量操作DataGridView中的数据,在列中加复选框,通过一个事件触发进行全选或取消,可是在外面添加按钮,这种模式虽然能够实现,但是从系统界面设计的角度,美 ...

  8. excel上传和下载

    需要注意的地方: 1.js构造表单并提交 2.js中文传参encodeURI(encodeURI("中文")),action接收并转换value = URLDecoder.deco ...

  9. Java应用架构的演化之路

    Java应用架构的演化之路 当我们架设一个系统的时候通常需要考虑到如何与其他系统交互,所以我们首先需要知道各种系统之间是如何交互的,使用何种技术实现. 1. 不同系统不同语言之间的交互 现 在我们常见 ...

  10. php生成excel文件的简单方法

    生成excel文件,最简单的莫过于把数据库的数据导入到excel就行了. 生成excel 当然使用的是 phpExcel http://www.jbxue.com/tags/phpexcel.html ...