c ++中的const和static说明符

Jag*_*gan 6 c++

#include<iostream>
using namespace std;
class A
{
        private:
                const  int a=9;
        public:
                void display()
                {
                    cout<<a;
                }
};
int main()
{
        A a;
        a.display();
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么不允许初始化const int a = 9.但是,如果我写了常量静态int a = 9编译器没有显示任何错误.写const static int a = 9是什么意思?我什么时候写这样的?

Pra*_*rav 5

使用构造函数初始化列表初始化非静态常量成员.

ISO C++ 03说明了有关静态数据成员的以下内容.

[class.static.data]

9.4.2 Static data members

1静态数据成员不是类的子对象的一部分.该类的所有对象只共享一个静态数据成员的副本

2在类定义中声明静态数据成员不是定义,除了cv-qualified void之外,它可能是不完整的类型.staticdata成员的定义应出现在包含成员类定义的命名空间范围内.在命名空间作用域的定义中,静态数据成员的名称应使用::运算符通过其类名限定.`

如果静态数据成员是const integer或const枚举类型,则它在类定义中的声明可以指定一个常量初始化器,它应该是一个整型常量表达式(5.19).在这种情况下,成员可以出现在整数常量表达式中. 如果在程序中使用该成员,并且名称空间作用域定义不包含初始化程序*,则该成员仍应在名称空间作用域中定义.

class A
{
        private:

                const  int a=9; //incorrect 
                static const int b = 10; //declaration (correct)
                static const double c = 1.3 //incorrect (Only const-static int members can be initialized like that)


        public:

                A(): a(9){} 
};

const int A::b; //definition of const-static int member
Run Code Online (Sandbox Code Playgroud)

如果(并且仅当)它具有类外定义,您可以获取静态成员的地址:

class AE {
    // ...
public:
    static const int c6 = 7;
    static const int c7 = 31;
};

const int AE::c7;   // definition

int f()
{
    const int* p1 = &AE::c6;    // error: c6 not an lvalue
    const int* p2 = &AE::c7;    // ok
    // ...
}
Run Code Online (Sandbox Code Playgroud)