• 类的静态成员变量


    因为类的静态成员变量是所有实例共用的.所以得在类外初始化.

    调用的时候可以通过对象调用,也可以通过类直接调用

     1 class A
     2 {
     3 public:
     4     int i;    //有默认值
     5 };
     6 class B
     7 {
     8 public:
     9     static int n;
    10     static A Aobj;
    11 };
    12 
    13 int B::n = 1;    //静态成员变量的初始化
    14 A B::Aobj;       //静态成员变量的初始化(实例化)
    15 
    16 void main()
    17 {
    18     B Bobj;    //注释掉这行也能输出B::n
    19     printf("B::n=%d Bobj.n=%d Bobj.Aobj.i=%d
    ", B::n, Bobj.n, Bobj.Aobj.i);
    20 }

    输出“B::n=1 Bobj.n=1 Bobj.Aobj.i=0 ”

    私有的静态成员变量也是放在类外初始化的.这看起来跟它的私有属性不相符.

    再做下面的测试,发现了一个有趣的现象.

     1 class B
     2 {
     3     static int i;
     4 public:
     5     B(){i=3;};    //把这行注释掉,输出变成2
     6     int p(){return i;};
     7 };
     8 
     9 int B::i = 2;      //把这行注释掉,编译报错 注:这个很关键,不管是私有还是公共静态成员变量,都必须先在外面初始化
    10 
    11 void main()
    12 {
    13     B Bobj;
    14     printf("private: static int B::i=%d
    ", Bobj.p());    //输出3
    15 }

    类外的初始化那一行是必要的(不管私有还是公共静态成员变量),而且是在构造函数之前就执行了的

    于是我的理解是:

    静态成员变量的定义一共包括两个部分.

    像函数一样,要先在类中声明,然后再找个地方实现.静态成员也要先在类中声明了,再到类外"实现"一下.

    这种初始化方式是由静态成员的公有性质决定的,它不能放在构造函数里由每一个对象来初始化,必须在类外实现

    转自:http://www.cnblogs.com/iceqq/archive/2009/05/03/1448147.html

    举例:

    App.h

    #ifndef APP_H
    #define APP_H
    
    class A;
    
    class App
    {
    public:    
        static int n;
        static A a;
    };
    
    class A
    {
    public:
        explicit A(char c='a');
    };
    
    #endif // APP_H

    App.cpp

    #include "app.h"
    
    int App::n=0;
    A App::a;//类似A App::a('c')也可
    
    A::A(char c)
    {
    
    }
  • 相关阅读:
    多语言资源文件制作工具
    window service 插件服务插件开发
    .net 中读取自定义Config文件
    Asp.net 主题中CSS文件的缓存问题
    Asp .net 4.0 中ViewStatus 使用
    Linq通用分页数据查询方法
    EF中查询出现死锁的处理
    Windows Live Writer 分享到插件
    Windows Resx资源文件编辑工具
    插件式服务架构
  • 原文地址:https://www.cnblogs.com/liushui-sky/p/5737578.html
Copyright © 2020-2023  润新知