类中static成员初始化

来源:互联网 发布:c语言中整型变量 编辑:程序博客网 时间:2024/05/16 06:32
异步赠书:9月重磅新书升级,本本经典    SDCC 2017之区块链技术实战线上峰会    程序员9月书讯    每周荐书:Java Web、Python极客编程(评论送书)

static成员必须在类外初始化

12317人阅读 评论(1)收藏举报
分类:
作者同类文章X

    目录(?)[+]

    1. 为什么static成员必须在类外初始化
    2. 为什么静态成员不能在类内初始化
    3. 什么东西能在类内初始化

    转:http://www.cnblogs.com/graphics/archive/2010/07/16/1778743.html

    为什么static成员必须在类外初始化

    为什么静态成员不能在类内初始化

    在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样

    class A{  private:    static int count ; // 类内声明};int A::count = 0 ; // 类外初始化,不必再加static关键字

    为什么?因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。

    什么东西能在类内初始化

    能在类中初始化的成员只有一种,那就是静态常量成员。

    这样不行

    class A{  private:    static int count = 0; // 静态成员不能在类内初始化};

    这样也不行

    class A{  private:    const int count = 0; // 常量成员也不能在类内初始化};

    但是这样可以

    class A{  private:    static const int count = 0; // 静态常量成员可以在类内初始化};

     

    结论:

    • 静态常量数据成员可以在类内初始化(即类内声明的同时初始化),也可以在类外,即类的实现文件中初始化,不能在构造函数中初始化,也不能在构造函数的初始化列表中初始化;
    • 静态非常量数据成员只能在类外,即类的实现文件中初始化,也不能在构造函数中初始化,不能在构造函数的初始化列表中初始化;
    • 非静态的常量数据成员不能在类内初始化,也不能在构造函数中初始化,而只能且必须在构造函数的初始化列表中初始化;
    • 非静态的非常量数据成员不能在类内初始化,可以在构造函数中初始化,也可以在构造函数的初始化列表中初始化;

     

    总结如下表:

    类型 初始化方式

    类内(声明)

    类外(类实现文件)

    构造函数中

    构造函数的初始化列表

    非静态非常量数据成员

    N

    N

    Y

    Y

    非静态常量数据成员

    N

    N

    N

    Y (must)

    静态非常量数据成员

    N

    Y (must)

    N

    N

    静态常量数据成员

    Y

    Y

    N

    N

     

     以下三种类型必须通过初始化列表来初始化
    1.非静态 常量


    2. 引用类型


    3. 没有默认构造函数的类类型

    1
    1
     
     

      相关文章推荐
    • 为什么static数据成员一定要在类外初始化?
    • 大数据技术实战线上峰会--董西成
    • C++类的静态成员变量为什么一定要初始化
    • 30天系统掌握机器学习--唐宇迪
    • c++ 防止头文件多次编译方法
    • ORACLE数据库学习资料集锦
    • 类模版静态成员初始化
    • PHP从零开始实战篇
    • redis C接口hiredis 简单函数使用介绍
    • 玩转微信小程序第一篇
    • C++ 初始化类的常量数据成员、静态数据成员、常量静态数据成员
    • 深度学习案例分享—人脸检测
    • C++ 初始化类的常量数据成员、静态数据成员、常量静态数据成员
    • 静态成员数据 静态对象初始化 .
    • Android检查更新下载安装
    • 为什么static成员必须在类外初始化
    查看评论
    1楼 zhui_xiuge2017-06-05 13:47发表 [回复] [引用][举报]
    写之前总该检验一下吧
    发表评论
    • 用 户 名:
    • CSDN_LSD
    • 评论内容:
    • 插入代码
      HTML/XMLobjective-cDelphiRubyPHPC#C++JavaScriptVisual BasicPythonJavaCSSSQL其它
        
    * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    快速回复TOP
    原创粉丝点击