在类中声明变量/常量时,经常会用到static、const关键字。对于该变/常量的初始化问题,网上有许多相关文章,但是大多不够完善,或者存在错误。经过实际验证,总结如下:
(注明:测试编译平台为VS2015和2010)
1 1 class TestClass 2 2 { 3 3 public: 4 4 TestClass()//:a(16) 5 5 { 6 6 cout << "TestClass Constructor ." << endl; 7 7 } 8 8 ~TestClass() 9 9 { 10 10 cout << "TestClass Destructor ." << endl; 11 11 12 12 } 13 13 14 14 int temp_a; // = 5; 15 15 static int temp_b; 16 16 const int temp_c; // = 25; 17 17 const static int temp_d; // = 35; 18 18 const static float temp_e; 19 19 };
int temp_a;
1、在声明处初始化;
2、在构造函数初始化列表中初始化;
对于非static、非const声明的变量,这两种初始化可以同时使用,同时使用时列表中的值会自动覆盖声明处的值。初始化不是必须的,若不进行初始化,其值是不确定的,可简单认为是随机的。该变量属于对象。
static int temp_b;
必须在类的声明体外进行定义(若在定义时不给初值,则编译器自动赋予默认值,int型变量的默认值为0),定义时不使用关键字static。例如:int TestClass::temp_b = 12;
该变量属于类,不属于特定的对象,可以理解为全局的,为所有所实例化的对象所共享。可在程序中通过类名作用域符号的方式访问(如:TestClass::temp_b = 18;),也可以通过对象访问。
const int temp_c;
1、在声明处初始化;
2、在构造函数初始化列表中初始化;
必须初始化,这两种初始化可以同时使用,同时使用时构造函数初始化列表中的值会自动覆盖声明处给的初值。
该常量属于对象,在对象声明时进行初始化,对象声明以后就不能再改变常量的值,即在对象的生存周期内其值不变。
const static int temp_d;//char short int long
1、在声明处初始化;(在声明处初始化,则可以不用在类的声明体外进行定义)
2、在类的声明体外进行定义并初始化;const int TestClass::temp_d = 15;
必须初始化,并且只能有一次初始化赋值(即1和2中,二选一)。char、short、long型静态常量都属于这种情况。
静态常量属于类,为所有的对象共享,既然是常量,初始化以后肯定就不能再有赋值操作。
const static float temp_e; //float double
只能且必须在类的声明体外进行定义和初始化 const float TestClass::temp_e = 0.234f; 静态常量的浮点型数据属于这种情况。
简单总结一下:
1、仅仅有关键字const,由于是常量,就必须进行初始化;可在声明处和构造函数列表中进行初始化,可以二选一,亦可以在这两处都初始化,初始化列表中的赋值会自动覆盖声明处的值。
2、仅仅有static,由于是静态变量,属于类本身,则必须在类的生命体外进行定义(若不给初值,则为默认值)
3,同时又static和const,这两个关键字的前后顺序无所谓,由于是静态常量,即同时具有静态和长常量的属性,使用条件就更加苛刻(即为一个常量,那就必须有初始化,并且还是静态的,那就自然属于类本身了)。整形数据可以在声明处初始化或者在类的声明体外进行定义并初始化,二选一。浮点型数据只能且必须在类的声明体外进行定义并初始化。
仅在VS平台进行了测试,若有不对之处,敬请指正,希望多多交流,共同进步。