精华内容
下载资源
问答
  • 全局变量和静态(全局和局部)变量 什么时候初始化? 本文链接:https://blog.csdn.net/sunny04/article/details/18605273 1. 静态变量初始化是在编译时进行,变量的赋值是在函数或程序运行时进行。 2. 静态变量只...

    全局变量和静态(全局和局部)变量 什么时候初始化?

    本文链接:https://blog.csdn.net/sunny04/article/details/18605273

    1. 静态变量的初始化是在编译时进行,变量的赋值是在函数或程序运行时进行。
    2. 静态变量只初始化一次,但可以通过赋值的方式多次修改静态变量的值。
    3. 全局变量和静态变量 在进入 main 前被初始化

    展开全文
  • 1. 静态变量初始化是在编译时进行,变量的赋值是在函数或程序运行时进行。 2. 静态变量初始化一次,但可以通过赋值的方式多次修改静态变量的值。 3. 全局变量和静态变量 在进入 main 前被初始化
    1. 静态变量的初始化是在编译时进行,变量的赋值是在函数或程序运行时进行。
    2. 静态变量只初始化一次,但可以通过赋值的方式多次修改静态变量的值。
    3. 全局变量和静态变量 在进入 main 前被初始化
    展开全文
  • 全局变量、文件域的静态...局部静态变量(一般为函数内的静态变量)在第一次使用时分配内存并初始化。这里的变量包含内置数据类型和自定义类型的对象。 class B{ public: B() { cout ; } ~B() { cout << "B

    全局变量、文件域的静态变量和类的静态成员变量在main执行之前的静态初始化过程中分配内存并初始化;局部静态变量(一般为函数内的静态变量)在第一次使用时分配内存并初始化。这里的变量包含内置数据类型和自定义类型的对象。

    class B{
    public:
    	B()
    	{
    		cout << "B constructor called" << endl;
    	}
    	~B()
    	{
    		cout << "B desconstructor called" << endl;
    	}
    };
    class A{
    public:
    	A()
    	{
    		cout << "A constructor called" << endl;
    	}
    	~A()
    	{
    		cout << "A desconstructor called" << endl;
    	}
    private:
    	static B b;
    };
    
    class C{
    public:
    	C()
    	{
    		cout << "C constructor called" << endl;
    	}
    	~C()
    	{
    		cout << "C desconstructor called" << endl;
    	}
    };
    class D{
    public:
    	D()
    	{
    		cout << "D constructor called" << endl;
    	}
    	~D()
    	{
    		cout << "D desconstructor called" << endl;
    	}
    };
    class E{
    public:
    	E()
    	{
    		cout << "E constructor called" << endl;
    	}
    	~E()
    	{
    		cout << "E desconstructor called" << endl;
    	}
    };
    int f()
    {
    	system("pause");
    	return 0;
    }
    C c;
    static E e;
    B A::b = B();//静态成员变量在类外初始化
    int main()
    {
    	_onexit(f);
    	A *pa = new A;
    	B b;
    	static D d;
    	delete pa;
    	return 0;
    }
    输出:

    C constructor called//全局变量初始化在main执行之前
    E constructor called//全局静态变量初始化在main之前

    B constructor called//类中的静态成员变量在类外初始化在main之前

    A constructor called//main中执行A的默认构造函数,但是没有调用B的默认构造函数,(若A中的成员变量b不是static型的,那么在调用A的构造函数                                                                                                             时,系统会调用B的默认构造函数,这里涉及到构造函数成员初始化列表的作用)

    B constructor called//构造b

    D constructor called//局部静态变量在第一次使用时初始化

    A desconstructor called//显示调用A的析构

    B desconstructor called//局部变量在栈上,早析构

    D desconstructor called//局部静态变量出了main后析构

    B desconstructor called//类的静态成员变量析构

    E desconstructor called//全局静态变量析构

    C desconstructor called//全局变量析构,这后边三个析构顺序,应该和它们的构造顺序相反!!!!

    下边内容转载:

    有些成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同。这些特殊的类型的成员变量包括:

    a.引用

    b.常量

    c.静态

    d.静态常量(整型)

    e.静态常量(非整型)

    常量和引用,必须通过参数列表进行初始化。这里不包括常量静态成员变量,因为无法通过构造函数初始化静态类数据。但是非常量静态类数据,可以通过构造函数体赋值。

    例如:

    class Test {
    public:
    	int a;
    	static int b;
    public:
    	Test(int _a, int _b) : a(_a){
    		b = _b;
    	}
    };
    int Test::b;
    int main() {
    	Test t1(0, 0), t2(1, 1);
    	t1.b = 10;
    	t2.b = 20;
    	printf("%u %u %u %u", t1.a, t1.b, t2.a, t2.b);
    	system("pause");
    	return 0;
    }
    但如果是常量静态类数据就不行了,因为不能对常量赋值。

    静态成员变量的初始化也颇有点特别,是在类外初始化且不能再带有static关键字,记住是类外初始化,但可以在构造函数中赋值,其本质见文末。

    参考下面的代码以及其中注释:

        #include   
        using namespace std;  
          
        class BClass  
        {  
        public:  
         BClass() : i(1), ci(2), ri(i){} // 对于常量型成员变量和引用型成员变量,必须通过参数化列表的方式进行初始化  
                                                        //普通成员变量也可以放在函数体里,但是本质其实已不是初始化,而是一种普通的运算操作-->赋值运算,效率也低  
        private:  
         int i;                                  // 普通成员变量  
         const int ci;                           // 常量成员变量  
         int &ri;                                // 引用成员变量  
         static int si;                          // 静态成员变量  
         //static int si2 = 100;                 // error: 只有静态常量成员变量,才可以这样初始化  
         static const int csi;                   // 静态常量成员变量  
         static const int csi2 = 100;            // 静态常量成员变量的初始化(Integral type)    (1)  
         static const double csd;                // 静态常量成员变量(non-Integral type)  
         //static const double csd2 = 99.9;      // error: 只有静态常量整型数据成员才可以在类中初始化  
        };  
          
        //注意下面三行:不能再带有static  
        int BClass::si = 0; // 静态成员变量的初始化(Integral type)  
        const int BClass::csi = 1; // 静态常量成员变量的初始化(Integral type)  
        const double BClass::csd = 99.9; // 静态常量成员变量的初始化(non-Integral type
    静态成员属于类作用域,但不属于类对象,和普通的static变量一样,程序一运行就分配内存并初始化,生命周期和程序一致。
    所以,在类的构造函数里初始化static变量显然是不合理的。
    静态成员其实和全局变量地位是一样的,只不过编译器把它的使用限制在类作用域内(不是类对象,它不属于类对象成员),要在类的定义外(不是类作用域外)初始化。

    下面再说说成员变量是引用的情况:

    因为引用是别名的意思,所以定义应用肯定是外部有定义,然后在构造函数初始化列表中被初始化的。

    如果两个类要对第三个类的数据进行共享处理,可以考虑把第三个类作为这两个类的引用类型的成员变量。

    展开全文
  • 局部静态变量初始化与异常

    千次阅读 2011-03-26 22:34:00
    编程的过程中,思考了一个...当一个局部的静态变量使用一个函数的返回值初始化时,如果该函数抛出异常,那么,局部静态变量是否被定义成功,即,如果再次调用包含局部静态变量的函数,抛出异常的函数会不会再次被调用。

    1、问题

    编程的过程中,思考了一个问题。当一个局部的静态变量使用一个函数的返回值初始化时,如果该函数抛出异常,那么,局部静态变量是否被定义成功,即,如果再次调用包含局部静态变量的函数,抛出异常的函数会不会再次被调用。

    2、测试

    就此问题,我写了如下的测试程序:

     

    3、结果

    1、在VC9中:第二次调用TestStatic函数不再抛出异常,即,局部静态变量已经定义成功。

    2、在gcc中:第二次调用TestStatic函数依旧抛出异常,即,局部静态变量没有定义成功,需要再次进入定义,实现真正的内存分配空间。

     

    对于结果,我更欣赏GNU的方式!

    不管喜欢那种方式,测试结果都告诉我们,这段代码并部具有可移植性。VC的方式,让我比较失望,因为,因此而失去了一个通用的编程技巧。然而,知道什么是错的,比知道什么是对的还要重要,难道不是吗?

    4、背景与应用

    有朋友会问,这样的问题,什么情况下会遇到?

    我只用一个比较经典的例子来说明。略微熟悉设计模式的朋友都会知道Singleton模式。一般返回的都是一个具体类的实例。虽说一般情况下构造函数中不要抛出异常,但免不了在某些情况下,可能会抛出异常,尤其是在这种单实例模式的情形下,没有必要一定保持构造函数中一定不抛出异常(stl要求容器中的类的构造函数不要抛出异常),所以,在这种情况下,我们似乎会希望,如果构造不成功,客户函数捕获异常,并修复错误后,再次获得单实例时,希望能够再次进行初始化,而得到一个正确的单实例的引用。然而,在这种情况下,面对两个编译器的测试结果,这段代码并不具有可移植性。

    如果,只是如果,GNU编译器的方式是一个规范的话,那么,我们在Singleton模式下,就无需判断返回的对象是否有效,如果发生异常,也无须在实现类中编写弥补的代码,只需要再次重新获得Singleton即可,可以简化代码。但,这只是如果。

     

    5、补充

    回复 scwinter:

    多谢兄弟关注!刚才我测试了一下,启用和未启用异常展开语义,编译的结果是不一样的。又掌握了一个知识点!结果如下:
    E:/temp/C++>cl test.cpp
    用于 80x86 的 Microsoft (R) 32 位 C/C++ 优化编译器 15.00.30729.01 版
    版权所有(C) Microsoft Corporation。保留所有权利。

    test.cpp
    C:/Program Files/Microsoft Visual Studio 9.0/VC/INCLUDE/xlocale(342) : warning C4530: 使用了 C++ 异常处理程序,但未启用展开语义。请指定 /EHsc
    Microsoft (R) Incremental Linker Version 9.00.30729.01
    Copyright (C) Microsoft Corporation.  All rights reserved.

    /out:test.exe
    test.obj

    E:/temp/C++>test
    exc1:100
    TestStatic:0

     

    E:/temp/C++>cl test.cpp /EHsc
    用于 80x86 的 Microsoft (R) 32 位 C/C++ 优化编译器 15.00.30729.01 版
    版权所有(C) Microsoft Corporation。保留所有权利。

    test.cpp
    Microsoft (R) Incremental Linker Version 9.00.30729.01
    Copyright (C) Microsoft Corporation.  All rights reserved.

    /out:test.exe
    test.obj

    E:/temp/C++>test
    exc1:100
    exc2:100

     

     

    展开全文
  • 没有初值是不是自动给它赋值(网上好像有这么讲的),那什么时候在内存开辟空间呢(这个图上的生存期从main函数就开始)? 这些可能涉及计算机组成原理,我没学过,希望哪位高手能详细解释下,万分感谢!!!
  • 静态属性:随类的存在而存在,是在类加载的初始化静态属性:随实例的属性存在而存在。 局部变量局部变量不能加static,包括protected, private, public这些也不能加。局部变量保存在栈中。 局部编程必须在...
  • 类变量(也叫静态变量):是类中独立于方法之外的变量,用static 修饰。(static表示“全局的”、“静态的”,用来修饰成员变量和成员方法,或静态代码块(静态代码块独立于类成员,jvm加载类时会执行静态代码块,每...
  • 静态局部变量初始化问题

    千次阅读 2014-03-13 03:14:10
    在C中对静态变量初始化必须使用常量,在C++中却可以使用变量初始化静态变量。 C里面只允许静态初始化, C++允许动态初始化,可以参考C++标准3.6.2节 静态变量没有初始化时,与全局变量一样,默认值为0; 非...
  •  1、 已经初始化的全局变量存放与data数据段;未初始化的全局变量存放与bss数据段。  2、 静态的全局变量存放与data数据段  3、 局部变量存放在栈上。  4、 静态局部变量,并不是在调用函数时分配函数...
  • 全局变量,静态全局变量,静态局部变量,类静态成员内存分配与初始化问题 全局变量,静态全局变量,静态局部变量,类静态成员内存分配都为全局数据区(静态区)(data区) 他们都在程序执行之前就进行了内存分配 初始化...
  • 大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有...我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序以此是(静态变量
  • c++全局变量和静态局部变量初始化的时间 1.全局变量初始化在主函数之前 2.静态局部变量初始化在第一次调用这个静态局部变量之前 #include <iostream> using namespace std; class A { public: A(int a):m_a...
  • C++当中常常需要一个全局唯一的对象... 既然全局变量是可能有害的,那么,我们我们把它隐藏一下,放到某个类当中去,作为类的静态数据成员。这看上去不错,我也这么认为。当我们只是简单的需要一个全局对象时,这很
  • 局部静态变量是如何做到只初始化一次的? 关于编译选项 -Wa,-adlhn参考 http://blog.csdn.net/lanxinju/article/details/5900986     以下内容来自于内网别的高人的回复 可以写个程序测试一下:  ...
  • 什么时候初始化 根据 C++ 标准,全局变量初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊,main 函数执行前到底具体是什么时候呢?是编译时还是运行时?答案是既有编译时,也可能会有运行时...
  • 静态局部变量初始化

    千次阅读 2019-03-07 11:17:06
    原以为会每次调子函数时,都会初始化静态局部变量。实际并非如此 #include void key(void) { //static unsigned char key_up =1; unsigned char key_up =1; printf("key_up = %d \n", key_up); key_up = ...
  • 什么静态变量只需要初始化一次

    千次阅读 2015-04-27 10:55:34
    }当这个函数被反复调用时,i的值是会一直加的,也就是静态变量只被初始化了一次. 我对此产生了疑惑.不知道大家有没有.当改为:[cpp]int fun(){int i=0;i++;return i;}反复调用时都返回的是1; 这个例子
  • 局部变量定义后,必须初始化,即赋值,才能使用(它没有默认值)。 而类变量定义后可以不初始化,因为它有默认值。 类变量(实例变量):定义在类中,方法体之外。成员变量前面加 static 修饰符。 局部变量:定义在...
  • C++11 静态 局部变量 初始化 线程安全
  • 全局变量、全局静态变量、局部变量、局部静态变量区别
  • 1.全局静态变量只能被当前源文件引用,不能被工程里其它源文件引用。 除了这点特殊,其它与普通的全局...2.局部静态变量,只执行一次初始化,只能被所在函数引用,函数执行 完毕,变量仍存在,生存周期贯穿整个程序。
  • 静态方法只能访问类的静态成员,不能访问类的非... 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能
  • C++静态成员变量初始化

    万次阅读 2014-03-03 16:53:37
    需要注意的是:静态数据成员不能在类中初始化,一般在类外和main()函数之前初始化,缺省时初始化为0。 1.static成员的所有者是类本身,但是多个对象拥有一样的静态成员。从而在定义对象是不能通过构造函数对其...
  • 关于局部变量、局部静态变量的定义 局部变量:形参和函数体内部定义的变量。 局部静态变量:将局部变量定义为static类型。 三者区别 1.形参是一种自动对象,是由传递函数的实参进行初始化,作用域仅仅是在所在函数...
  • why静态变量只能被初始化一次?

    千次阅读 2017-11-02 14:47:27
    函数1int fun() { static int i=0; i++; return i; } 当fun函数被调用时,i会一直++函数2 int fun() { int i=0; i++; return i; } 当函数被调用时只会return 1;...静态变量:作用在
  • 例1 局部变量 void Test1() { ………… int buf[1024 * 1024]; ………… } 在windows下,由于栈限制为1M,上面代码可能会栈溢出,因此通过单步调试我们可以知道,局部变量是在进入函数时分配栈内存。 编译器...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 195,397
精华内容 78,158
关键字:

局部静态变量什么时候初始化