zoukankan      html  css  js  c++  java
  • 为什么static成员变量一定要在类外初始化?

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

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

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

    或者只进行定义不赋初始值,但是默认值是否是0,可能会与具体的编译器有关吧?

    // 只进行定义不赋初始值,但默认值视编译器而定
    int A::count;
    

    为什么?

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

    如果不增加int A::count = 0 ; //变量定义,在编译的时候将会报出:‘A::count’未定义的引用”错误。这是因为静态成员变量count未定义,也就是还没有分配内存,显然是不可以访问的。

    《c++primer》里面说在类外定义和初始化是保证static成员变量只被定义一次的好方法。 但为什么static const int就可以在类里面初始化呢?
    想起C中一个函数里定义一个static变量是为了保证只初始化一次。

    那么,是否可以这样理解: static数据成员在类外定义和初始化是为了保证只被定义和初始化一次,这样编译器就不必考虑类的函数里面第一个对static变量的’=’操作是赋值还是初始化了。 static const int可以在类里面初始化,是因为它既然是const的,那程序就不会再去试图初始化了。

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

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

    //这样不行 
    class A { 
    private: 
        static int count = 0; // 静态成员不能在类内初始化 
    };
     
    //这样也不行 
    class A { 
    private: 
        const int count = 0; // 常量成员也不能在类内初始化 
    };
     
    //但是这样可以 
    class A { 
    private: 
        static const int count = 0; // 静态整型常量成员可以在类内初始化,但是 static const float count就不行了 
    };
    
  • 相关阅读:
    druid:阿里巴巴开源,数据库连接池管理
    各JAVA开发框架版本及对应信息
    各版本区别
    MyBatis 知识点
    java的关键字:static、final
    请求转发(Forward)和重定向(Redirect)的区别
    Spring 向页面传值以及接受页面传过来的参数的方式
    Spring 框架中 ModelAndView、Model、ModelMap 的区别
    Connection: keep-alive,Content-Length,Transfer-Encoding: chunked,Content-Encoding: gzip等
    git 报错及解决
  • 原文地址:https://www.cnblogs.com/lixuejian/p/13215271.html
Copyright © 2011-2022 走看看