#include <iostream>

using namespace std;
/*
 * 规则:
 * 1、static 变量:声明在类中,定义赋值在类外
 * 2、const 变量:由于要进入符号表,在类中声明的时候就得赋值定义
 * 3、const static:在类外赋值的时候去掉static关键字
 * (1)某些类型:char,short,int,long可以选择方式1 or 2
 * (2)某些类型:float、double 选择方式1,必须在类外赋值定义
 * 4、static const:在类外赋值的时候去掉static关键字
 * (1)某些类型:char,short,int,long可以选择方式1 or 2
 * (2)某些类型:float、double 选择方式1,必须在类外赋值定义
*/

class A {
public:
    const static int num1; // const static 第(1)种类型声明
    const static int num2 = 2; // const static 第(2)种声明和初始化
    const int num3 = 3;
    static int num4;
    const static float num5; // 只能在类外面初始化,数据类型限:float double
    static const int num6 = 6; // 声明和初始化
    static const float num7; // 声明

    A():num3(3333)
    {
    	// this->num3 = 6666666; 错误的方式
        // 初始化列表可以覆盖const 类型的值。加了static不属于类,不可以构造函数初始化。
    }
};

const int A::num1 = 1; // const static(1)类型定义并初始化
//const int A::num2 = 2222222; // 定义并初始化,和第10行二选一,数据类型限:char  short  int  long
int A::num4 = 4;
const float A::num5 = 5; // 只能在类外面初始化,数据类型限:float double
const float A::num7 = 7; // 只能在类外面初始化,数据类型限:float double

int main()
{
    cout << A::num1 << endl;
    cout << A::num2 << endl;
    A a;
    cout << a.num3 << endl;
    cout << A::num4 << endl;
    cout << A::num5 << endl;
    cout << A::num6 << endl;
    cout << A::num7 << endl;

    return 0;

}


备份地址: 【const、static、const static、static const关键字的初始化