关于静态变量

1、Static的数据成员必须在类定义体的外部定义。

即在类内进行static 声明变量,在类的外部进行初始化,在main函数之前初始化,main结束销毁。

 1 #include <stdio.h>
 2
 3 class A{
 4
 5 public:
 6
 7 A(){printf("constructor of A\n");}
 8
 9 ~A(){printf("destruction of A\n");}
10
11 };
12
13 class B{
14
15 public:
16
17 static A a;
18
19 B(){printf("constructor of B\n");}
20
21 };
22
23 A B::a;
24
25 int main()
26
27 {
28
29 printf("main\n");
30
31 B b;
32
33 B c;
34
35 return 0;
36
37 }

2、函数内部局部static变量

c++把函数内部static变量的初始化推迟到了caller的第一次调用,程序结束时销毁, 而不是像其他global变量一样,在main之前就进行它们的初始化。在C语言中是编译不通过的!

 1 #include <stdio.h>
 2
 3 class A{
 4
 5 public:
 6
 7 A(){printf("constructor of A\n");}
 8
 9 ~A(){printf("destruction of A\n");}
10
11 };
12
13 int caller()
14
15 {
16
17 static A a;
18
19 printf("caller\n");
20
21 return 0;
22
23 }
24
25 int main()
26
27 {
28
29 printf("main\n");
30
31 caller();
32
33 caller();
34
35 return 0;
36
37 }

3、全局static变量

我们并不能确定全局静态变量的初始化顺序!Effective C++中就是用在函数中返回局部静态变量的方式来解决全局变量初始化顺序未知的问题的。

全局静态变量在main函数开始前初始化,在main函数结束后销魂。

 1 #include <stdio.h>
 2
 3 class A{
 4
 5 public:
 6
 7 A(){printf("constructor of A\n");}
 8
 9 ~A(){printf("destruction of A\n");}
10
11 };
12
13 static A a;
14
15 int main()
16
17 {
18
19 printf("main\n");
20
21 return 0;
22
23 }

时间: 2024-12-25 15:43:15

关于静态变量的相关文章

java线程安全问题之静态变量、实例变量、局部变量

Java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编程实践>中所说: 写道 给线程安全下定义比较困难.存在很多种定义,如:"一个类在可以被多个线程安全调用时就是线程安全的". 此处不赘述了,首先给出静态变量.实例变量.局部变量在多线程环境下的线程安全问题结论,然后用示例验证,请大家擦亮眼睛,有错必究,否则误人子弟! 静态变量:线程非安全. 静态变量即类变量,位于方法区,为所有对象共享,共享一份内存,一旦静态

静态变量导致的内存泄露

public  class MainActivity extends Activity{                private static final String TAG = "MainActivity";             private static Context sContext;                   @Override             protected void onCreate(Bundle savedInstanceState)

在activity之间通过静态变量传递数据

在activity之间通过静态变量传递数据 一.简介 主要作用:解决intent不能传递非序列化的对象 评价:简单方便,不过intent方式更加简单和方便 二.具体操作 1.在传输数据的页面弄好数据,传递给接收数据的页面 Obj1 obj=new Obj1("fry",22); Activity01.obj=obj; 2.在接收数据的页面显示数据 输出obj即可 3.具体代码 传输数据的页面 Intent intent=new Intent();//初始化intent intent.s

Java初始化顺序(静态变量、静态初始化块、实例变量、实例初始化块、构造方法)

1.执行顺序 1.1.一个类中的初始化顺序 (静态变量.静态初始化块)=>(变量.初始化块.构造器). 1.2.两个具有继承关系类的初始化顺序 父类的(静态变量.静态初始化块)=> 子类的(静态变量.静态初始化块)=> 父类的(变量.初始化块.构造器)=> 子类的(变量.初始化块.构造器). 示例如下:(结果见注释) 1 class A { 2 public A() { 3 System.out.println("Constructor A."); 4 } 5

关于一个静态变量的计算

代码如下: <?php $count = 5; function get_count(){ static $count = 0; return $count++; } echo $count; //5 ++$count; echo get_count(); //0 echo get_count(); //1 echo $count; //6 关于静态变量的说法可以参看C++的:static静态变量的理解

static、静态变量、静态方法

1 静态:static 1.1 用法 是一个修饰符:用于修饰成员(成员变量和成员函数) 1.2 好处 当成员变量被静态static修饰后,就多了一种调用方式,除了可以被对象调用外,还可以直接被类名调用格式:类名.静态成员,也就变成了类变量 2 静态的特点 2.1 随着类的加载而加载,也就是,说静态会随着类的消失而消失,说明静态的生命周期最长 2.2 优先于对象的存在 明确一点:静态是先存在的对象是后存在的 2.3 被所有对象共享 2.4 可以直接用 类名. 调用 3 实例变量和类变量的区别 3.

(转)面试题--JAVA中静态块、静态变量加载顺序详解

1 public class Test { //1.第一步,准备加载类 2 3 public static void main(String[] args) { 4 new Test(); //4.第四步,new一个类,但在new之前要处理匿名代码块 5 } 6 7 static int num = 4; //2.第二步,静态变量和静态代码块的加载顺序由编写先后决定 8 9 { 10 num += 3; 11 System.out.println("b"); //5.第五步,按照顺序加

android产品研发(十)--&gt;不使用静态变量保存数据

转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了Android中的几种常见网络协议:xml,json,protobuf等,以及各自的优缺点,一般而言主要我们的App涉及到了网络传输都会有这方面的内容,具体可根据项目的需求确定各自的网络传输协议.这里可参考android产品研发(九)–>App网络传输协议 而本文讲解的其实并不是一个技术方面,而是一个android产品研发过程中的技巧:尽量不使用静态变量保存核心数据.这是为什么呢?这是因为android的进程并不是安全的,包括applicat

Java中静态变量与静态方法的继承

class A { static int a = 1; static int b = 2; public static void printA() { System.out.println(a); } public static void printB() { System.out.println(b); } } class B extends A { static int a = 3; static int b = 4; public static void printB() { // 如果B

20141223--全局使用局部变量+静态变量-01

回顾 运算符:算术,比较,逻辑,赋值,三目,错误抑制,位运算(三码),自操作,字符串 执行结构:顺序,分支(if和switch),循环(for,while,do-while,foreach) 函数:自定义函数(函数名,参数(形参,实参),函数体,返回值) 自定义函数 返回值 返回值指的当函数调用结束以后,该函数给外部调用处返回一些列的数据(数据类型任意:八个数据类型) 如果函数没有任何返回值,可以理解为函数返回的是NULL. PHP中函数可以没有返回值. 参数传值 传值方式:值传递(默认的)和引