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. 让内层Div将外层Div撑开

    在CSS排版中,如果一个层中的层使用了float浮动的话,那么就有可能会出现外层没有被内层撑开的情况,如以下代码所示: <div style="width:300px; "& ...

  2. 【.NET】MD5的用法(对文件、字符串)

    using System;using System.IO;using System.Security.Cryptography;using System.Text;namespace ConsoleA ...

  3. css规范大全

    一.文件规范 1.文件均归档至约定的目录中 所有的CSS分为两大类:通用类和业务类.通用的CSS文件,放在如下目录中: 基本样式库 /css/core 通用UI元素样式库 /css/lib JS组件相 ...

  4. angular.foreach 循环方法使用指南

    angular有自己的生命周期.循环给一个 angular监听的变量复值时.最好还是用angular自带的循环方法.“angular.foreach” },{a:}]; angular.forEach ...

  5. SVN创建Tags

              右键trunk,选择分支/标记...           资源库,到URL:要创建Tag的位置           Next           Next             ...

  6. C puzzles详解【26-30题】

    第二十六题(不会) The following is a simple program which implements a minimal version of banner command ava ...

  7. 使用eclipse与jLink V8调试exynos 4412 u-boot

    /** ****************************************************************************** * @author    Maox ...

  8. 遍历List/Map的时候删除成员遇到的奇怪问题

    1.for each删除成员 List<String> list = new LinkedList<String>(); list.add("a"); li ...

  9. css3 2d

    CSS3 2D 转换   通过 CSS3 转换,我们能够对元素进行移动.缩放.转动.拉长或拉伸. 以下是 2D 转换 1 translate()通过 translate() 方法,元素从其当前位置移动 ...

  10. FileSystemWatcher用法详解

    FileSystemWatcher控件主要功能: 监控指定文件或目录的文件的创建.删除.改动.重命名等活动.可以动态地定义需要监控的文件类型及文件属性改动的类型. 1.常用的几个基本属性: (1) P ...