【本文链接】

http://www.cnblogs.com/hellogiser/p/global-local-static-object.html

【分析】

1.生命周期问题:static变量在固定的内存区域进行存储分配,变量生命期一直到程序运行结束。而普通变量:局部变量和全局变量的存储分配在不同的地方进行,局部变量是在堆栈里面存储分配,变量生命周期随着函数的退出而结束;全局变量是在静态存储区存储分配(跟static变量一样)。

2.可见性问题:一个类里面的static变量在类外是不可见的;函数内部的static变量在函数外是不可见的;函数外的static变量只在当前编译单元可见。

3.初始化问题:全局static变量在main函数运行前初始化;局部static变量在第一次所在函数被调用时初始化。对于内部类型,字符类型初始化为ascii值为0的字符,其他类型初始化为0;用户定义类型,要由构造函数初始化。

注:如果一个包含局部static对象的函数未被调用,那么这个对象的构造函数也不会被调用。

4.静态对象的析构函数调用:在程序从main()中退出时,或者标准的C库函数exit()函数被调用时才被调用。调用abort()退出程序时,静态对象的析构函数并不会被调用。静态对象的销毁也是按与初始化时相反的顺序进行的。

【代码】

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 
/*
    version: 1.0
    author: hellogiser
    blog: http://www.cnblogs.com/hellogiser
    date: 2014/9/20
*/

#include "stdafx.h"
#include "iostream"
using namespace std;

class MyClass
{
    char c;
public:
    MyClass(char cc): c(cc)
    {
        cout << "MyClass::MyClass() for " << c << endl;
    }
    ~MyClass()
    {
        cout << "MyClass::~MyClass() for " << c << endl;
    }
};

static MyClass a ('a'); // global static
void f()
{
    static MyClass b('b'); // local static
}

void g()
{
    static MyClass c('c'); // local static
}

int main()
{
    cout << "inside main()" << endl;
    f();
    static float f; // local static  initialized with 0
    static int i;   // local static  initialized with 0
    cout << "float f:" << f << endl;
    cout << "int i:" << i << endl;
    cout << "leaving main()" << endl;

;
}
/*
MyClass::MyClass() for a
inside main()
MyClass::MyClass() for b
float f:0
int i:0
leaving main()
MyClass::~MyClass() for b
MyClass::~MyClass() for a
*/

【参考】

http://www.cnblogs.com/liujiangyi/archive/2012/08/13/2635840.html

global-local-static-object的更多相关文章

  1. 【翻译自mos文章】关于分区索引:Global, Local, Prefixed and Non-Prefixed

    来源于: Partitioned Indexes: Global, Local, Prefixed and Non-Prefixed (文档 ID 69374.1) APPLIES TO: Oracl ...

  2. Global & Local Variable in Python

    Following code explain how 'global' works in the distinction of global variable and local variable. ...

  3. [转] boost库的Singleton的实现以及static成员的初始化问题

    http://www.cnblogs.com/kex1n/archive/2011/04/05/2006194.html effectie c++的条款4中提到: (global对象,定义在names ...

  4. 在不同语言中static的用法

    static (计算机高级语言) 编辑 像在VB,C#,C,C++,Java,PHP中我们可以看到static作为关键字和函数出现,在其他的高级计算机语言如FORTRAN.ALGOL.COBOL.BA ...

  5. stack与heap、new的内存分配、static对象。(effective c++ 04)

    阅读effective c++ 04 (30页) 提到的static对象和堆与栈对象."不同编译单元内定义的non-local static对象". 了解一下.    目录 sta ...

  6. static的作用

    在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有 ...

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

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

  8. 华为 1.static有什么用途?(请至少说明两种)

    1.static有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问 ...

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

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

  10. C语言中static关键字的作用

    static的作用(精辟分析) 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加sta ...

随机推荐

  1. word-break:brea-all;word-wrap:break-word的区别

    //form==>http://www.cnblogs.com/2050/archive/2012/08/10/2632256.html <p style="background ...

  2. MongoDB的安装及配置

    MongoDB 是目前在IT行业非常流行的一种非关系型数据库(NoSql),其灵活的数据存储方式备受当前IT从业人员的青睐. Windows (1). 登录Mongodb官网点击下载 (2). 将zi ...

  3. Spring+C3P0数据库连接池配置

    一.xml文件读取.properties文件连接数据库 1.xml文件中的配置 <bean id="dataSourceLocal" name="dataSourc ...

  4. 【bzoj2460】 BeiJing2011—元素

    www.lydsy.com/JudgeOnline/problem.php?id=2460 (题目链接) 题意 n个二元组(a,b),求一个∑b最大,且所有子集XOR<>0的集合 Solu ...

  5. 洛谷P1656 炸铁路

    题目描述 因为某国被某红色政权残酷的高压暴力统治.美国派出将军uim,对该国进行战略性措施,以解救涂炭的生灵. 该国有n个城市,这些城市以铁路相连.任意两个城市都可以通过铁路直接或者间接到达. uim ...

  6. IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习

    相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...

  7. json对象和json字符串有啥区别啊

    json对象可以通过javascript存取属性!json对象装成json字符串经常用于前后台传输数据! 如果你在前台使用,那么Json对象可以通过xx.name来调用,如果是字符串,那么就是字符串了 ...

  8. 初学JDBC,调用存储过程

    在JDBC简单封装的基础上实现 public class UserDao{ public static void testGetUser(String userName) throws Excepti ...

  9. hdu 1003 Max Sum(动态规划)

    解题思路: 本题在给定的集合中找到最大的子集合[子集合:集合的元素的总和,是所有子集合中的最大解.] 结果输出: 最大的子集合的所有元素的和,子集合在集合中的范围区间. 依次对元素相加,存到一个 su ...

  10. JS 下拉菜单

    HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...