关于C++全局变量和静态变量初始化的一些总结

时间:2022-01-06 19:43:02

1.全局变量

    全局变量无疑要在main函数开始前执行完成,但可细分为在编译时和在运行时初始化,即static initialization和dynamic initialization。

  •  static initialization

           静态初始化按照我的理解,是针对那些较为简单的,c++内部定义的数据结构,如int,double,bool及其数组结构的初始化。又可分为zero和const两种方式。

           对于zero初始化,编译时编译器将其分配在.bss段,不占用rom空间;而const初始化,也就是我们指定了全局变量的初始值,编译器会将其分配在.data段,占用romon空间。

  •  dynamic initialization

           这种初始化针对的是需要调用构造函数才能完成的初始化。这种初始化会在main函数执行前由运行时库调用对应的代码进行初始化。

    静态初始化先于动态初始化,这一点很好理解。静态初始化在编译时初始化,直接写进.bss和.data段,程序执行时直接加载,而动态初始化只能在运行时由运行时库调用相应构造函数

    进行初始化。

2.类的静态成员

    C++规定,const的静态成员可以直接在类内初始化,而非const的静态成员需要在类外声明以初始化。对于后一种情况,我们一般选择在类的实现文件中初始化。

    至此,具体的初始化方式和上面所说的又是一致的,可在编译期间初始化,也可以在运行时初始化。

3.关于静态成员函数和静态成员变量的使用

    两者都可以通过类名+"::"的方式进行使用,此外,对于类的对象,指针或引用,也可以直接调用。但类的静态成员函数由于不含有this指针,只能引用其类的静态成员变量。

    不过有一种技巧,可以给类的静态成员函数传递该类的指针、引用等作为形参,强行使用该类的对象。