初始化,这个东西很熟悉,也很常用,愣一看也感觉挺简单的,但是在写代码的时候,发现在一些特殊情况下,如果直接不假思索就进行初始化的话,可能会出现一些问题。
这个特殊情况主要是几个关键字,我目前比较常用的关键字是const和static,其他的关键字我因为没怎么用过暂不多说,如果以后用到了再进行补充。
一般情况下,变量定义的位置包括类内和类外,类内又分为.h和.cpp文件中,那么初始化的位置一般是在构造函数的初始化列表中进行,但是如果采用了const和static关键字进行修饰,则可能会出现问题。
const修饰的变量的初始化位置主要有两种:
1.在构造函数的初始化列表中进行(C++98支持);
2.在类内声明的时候初始化(C++11支持)。
这两种方法我个人感觉没有什么太多的好坏之分,都可以使用,当然我个人更偏爱在类内声明时候初始化的这种方式,因为我认为它是一个常量,在创建的时候就进行初始化,更能体现出它本身不会被更改的效果。
之所以可以在初始化列表中初始化,原因在于:
1.const修饰的数据值不可改,即便在实例化对象的时候多次执行构造函数,但是值是惟一的;
2.const修饰的数据成员存放在静态数据存储区,它的特点是生命周期不跟随类实例化对象的周期,而在于整个程序的生存时间;
3.存放在静态数据存储区的同一数据成员只能存在一份,这就避免了创建多个的情况。
另一个就是static修饰的变量的初始化,它的初始化方式比较特殊,如果像const修饰的变量一样在构造函数中进行初始化,编译的时候会报“无法通过构造函数初始化静态类数据”的错误。
如果对static修饰的变量,在类内声明的时候初始化,编译的时候会报“带有类内初始值设定项的静态数据成员必须具有不可变的常量整型”,这个报错就很有意思了,它的意思是说如果想要在类内创建的时候初始化,必须是const修饰的不可变的常量整型,这点就与上面的const初始化的位置重合了,这一点就说明只有用const修饰的常量整型才能在类内声明的时候初始化,这点谨记。
其实也是比较容易理解的,因为static修饰的变量是为该类的所有对象所共有的,这就导致如果在初始化列表或者是类内声明的时候初始化,那么该变量的结果会在创建不同对象的时候一次次地初始化为某一个固定的值,这就与其被类的所有对象共有的特点冲突了,因为没法实现一人改,其他人都能享受更改之后的结果的效果。
因此,因为用static修饰的数据成员被该类的所有对象所共用,则无法在类内进行初始化,只能在类外的.cpp文件中进行初始化,并且在初始化的时候不需要再次指出该变量的static属性(也就是不用再写static关键字)。
在说到static修饰的静态变量的时候,提到了一点,如果在类内声明的时候初始化,会报“该变量不是不可变的常量整型”的错误,那么,针对这种情况,产生了一种新的“组合数据类型”——static const,用这个组合数据类型修饰的变量,具有“静态”、“常量”的特性,因为它是常量,因此可以在类内声明的时候初始化,这点不违背编译器的逻辑。
还有一点就是,因为是静态数据,为该类的所有对象所共享,如果采用初始化列表的方式进行初始化,会造成每创建一个该类的对象就会创建一个该静态变量的情况,这点不符合逻辑。
因此,对于static const修饰的静态常量,只能在该变量声明的时候初始化。
总结:
1.const:可以的声明的时候初始化,也可以在初始化列表中初始化;
2.static:只能在类外.cpp文件中初始化;
3.static const:只能在类内声明的时候初始化。
参考博客:https://blog.csdn.net/this_is_me_anyway/article/details/79984420
原文:https://www.cnblogs.com/xiaotushi-keepAhead/p/11634376.html