C++中的static变量

虽然是老生常谈,但下面这篇文章还是概括地很全面的。

C++中的static有以下三种不同的效果:

  1. 当用于成员变量时,表示它将由类分配管理而不是实例。
  2. 当在一个函数中时,数据将会被静态分配,在函数第一次被调用时初始化,且一直存在到程序退出。它当然也仅在当前函数中可用。这个特性经常被用于单例的延迟建构。 
  3. 当在一个编译单元中(如源文件),它可以在本单元中视为全局的,但对于其它单元却是不可见的。

第三种情况会在无命名空间中允许类定义中并未导出的声明 (Use (3) is somewhat discouraged in favor of unnamed namespaces that also allows for un-exported class declarations.)

第二种情况和类或实例无关,只是一个函数所拥有的变量,而且仅有一份。

但是确实有一种情况下,会使得函数中的静态变量不止一份。对于模板函数而言,函数自身在程序可能会存在多份,当然这和类与实例无关。下面是一个示例:

#include<stdio.h>

template<int num>
void bar()
{
    static int baz;
    printf("bar<%i>::baz = %i\n", num, baz++);
}

int main()
{
    bar<1>(); // Output will be 0
    bar<2>(); // Output will be 0
    bar<3>(); // Output will be 0
    bar<1>(); // Output will be 1
    bar<2>(); // Output will be 1
    bar<3>(); // Output will be 1
    bar<1>(); // Output will be 2
    bar<2>(); // Output will be 2
    bar<3>(); // Output will be 2
    return 0;
}

原文(Stack Overflow): Static variables in class methods

时间: 2024-09-28 07:03:41

C++中的static变量的相关文章

【类中的static变量在栈中吗?】

问题描述 [类中的static变量在栈中吗?] 解决方案 在静态区中,是一个独立的区域,和堆.栈并列的 解决方案二: 数据区,跟全局变量等在一个sector 解决方案三: 局部变量: 栈区 局部静态变量:静态区 全局变量: 静态区的常量区 全局静态变量:静态区 内存分四个区:静态区,栈区,堆区,代码区 解决方案四: 当然不在,类中的一切变量都在堆上.堆栈上只有函数的局部变量. 解决方案五: 这个其实很好理解,都不需要死记硬背,也不需要看书. 一说你就明白了.为什么要堆栈?因为函数允许嵌套调用,所

asp.net中的static变量用法介绍

由于我们每次访问ASP.NET页面都是一个全新的对象,而不是我们上一次访问的对象.所以上次页面访问时我们对页面中变量的改动都没有保留.遇到这个问题的时候,很多初学者的直觉就是将这个变量申明为static,自己在测试的时候发现还真的保留住了页面的状态.窃喜之余没有发现这又有引入了另外一个错误.因为你要的只是页面能保留住状态,而这个状态是针对一个客户端的(session的效果).而得到的结果是只要一个客户端改变了该值所有的其他客户端都受到了影响(如同Applicatin的效果).这种情况下,需要的极

php 函数中使用static变量

 代码如下 复制代码 function sendHeader($num, $rtarr = null) {     static $sapi = null;     if ($sapi === null) {         $sapi = php_sapi_name();     }     return $sapi++; 看PW源码的时候发现setHeader()函数中使用static关键字,很奇怪,以前也没这样用过. static用在函数里面,声明一次变量后,如果再次调用这个函数将会在初始

static变量作用域

变量   static变量与asp.net 在C#中,static变量表示该变量属于类,而不是类的实例.可以说是该类的所有实例共享一个static变量.asp.net的页面就是一个类,我们访问一个页面.就会在服务器上实例化一个该类的实例,来响应我们的请求. "所有实例共享一个static变量" 这就意味着,所有的客户端访问到的asp.net页面中static变量都是同一个变量. 由于我们每次访问asp.net页面都是一个全新的对象,而不是我们上一次访问的对象.所以上次页面访问时我们对页

c语言-关于C语言中的static变量的问题

问题描述 关于C语言中的static变量的问题 下面的代码最终结果为什么是-10?去掉这个函数中的static则结果是-2可以理解,请教一下加了static后这个变量在函数的多次调用中是如何变化的 int fun() { static int a = 1; return ++a; } int main() { int b; b = fun()-fun()*fun(); printf("%d ",b); return 0; } 解决方案 这属于编译器未定义行为.也就是说,fun()-fu

java中static变量和static方法以及普通方法在那个内存中存储呢? 请高手指点,谢谢

问题描述 java中static变量和static方法以及普通方法在那个内存中存储呢? 请高手指点,谢谢 栈内存:局部变量和对象的引用变量: 堆内存:对象: 以上是我所知道的,那么static变量和static方法以及普通方法在那个内存中存储呢? 请高手指点,谢谢 解决方案 static和普通方法都存在堆内存中,堆内存有个永久区permgen,这里面会存类信息. 所以不断的加载类或jar包可能出现permgen oome的错误. static是在堆内存的数据区. 解决方案二: java stat

iOS中 static变量与全局、局部变量的区别 !

static变量与全局.局部变量的区别 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式. 这两者在存储方式上并无不同.这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的. 而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它.由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内

.net中如何把表单传递的get参数变为utf8编码的形式以及static变量的存在周期

问题描述 我是菜鸟,请教各位高手,3个问题:<formonsubmit=""action=""method="get"name="sousuo"><inputtype="text"name="wd"value="<%=wd%>"/><inputclass="button"type="submit&

java代码-java初学者提问 在类中 用static成员变量实例化自身类 程序的执行顺序过程是怎样的?

问题描述 java初学者提问 在类中 用static成员变量实例化自身类 程序的执行顺序过程是怎样的? class Demo03 { public static void main(String[] args) { A.show(); } } class A { //构造方法 A(){ System.out.println("构造方法执行"); System.out.println(b); System.out.println(c); } static A a=new A(); sta