• 类静态变量 问题


    类的静态成员变量 
    内存分配方式有三种:   
       
     (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。   
       
     (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。   
       
     (3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。  
    类的静态成员变量和函数中的静态变量一样,在编译的时候就分配内存了,直到程序退出才释放,并不是随着对象的删除而释放的:
     
     
     
    因为类的静态成员变量是所有实例共用的.所以得在类外初始化.
    调用的时候可以通过对象调用,也可以通过类直接调用
    class A
    {
    public:
        int i;    //有默认值
    };
    class B
    {
    public:
        static int n;
        static A Aobj;
    };

    int B::n = 1;    //静态成员变量的初始化
    A B::Aobj;       //静态成员变量的初始化(实例化)

    void main()
    {
        B Bobj;
        printf("B::n=%d Bobj.n=%d Bobj.Aobj.i=%d/n", B::n, Bobj.n, Bobj.Aobj.i);
    }
    私有的静态成员变量也是放在类外初始化的.这看起来跟它的私有属性不相符.
    再做下面的测试,发现了一个有趣的现象.
     
    class B
    {
        static int i;
    public:
        B(){i=3;};    //把这行注释掉,输出变成0
        int p(){return i;};
    };

    int B::i = 2;      //把这行注释掉,编译报错

    void main()
    {
        B Bobj;
        printf("private: static int B::i=%d/n", Bobj.p());    //输出3
    }
    这样看来.类外的初始化那一行根本没有起到初始化的作用.它赋的值根本没用.(对私有静态成员变量是这样.公有的还是有作用的)
    于是我的理解是:
    静态成员变量的定义一共包括两个部分.
    像函数一样,要先在类中声明,然后再找个地方实现.静态成员也要先在类中声明了,再到类外"实现"一下.
    只是私有的静态成员在类外是不可访问的.于是在类外的赋值语句将不起作用,只起到一个"实现"的作用.
     
     
    我的理解:私有的静态成员变量在编译 的时候就已经为其分配好内存了,并为其初始化,当用类定义对象的时候,就会调用类的构造函数重新给静态成员变量赋值。
     

  • 相关阅读:
    Pytest单元测试框架之FixTure内置临时文件tmpdir操作
    Python+Request库+第三方平台实现验证码识别示例
    Pytest单元测试框架之parametrize参数化
    Pytest单元测试框架之setup/teardown模块示例操作
    mysql匿名账户登录导致的"ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql'"错误
    求全排列
    (转载)你真的会写单例模式吗——Java实现
    《大话设计模式》之--第14章 老板回来,我不知道----观察者模式
    关于java Integer大小比较的问题
    Java char[] 数组转为 String 的两种方式
  • 原文地址:https://www.cnblogs.com/ouyangping/p/6421456.html
Copyright © 2020-2023  润新知