条款4 确定对象被使用前已先被初始化

条款4 确定对象被使用前已先被初始化

C++中class的初始化动作发生在进入构造函数本体前。构造函数内的是赋值,而不是初始化。最好使用成员处置列(member initialization list)

例如:

class A{
public:
    A(int num):x(num){}; //这是初始化,而构造函数本体不需要做任何动作
private:
    int x;
};

不同变异单元内定义之non-local static对象的初始化次序

C++对于不同编译单元内的non-local static对象的初始化次序并没有明确定义

因为决定它们的初始化次序很难,最常见形式是多个编译单元内的non-local static 对象 经由“模板隐式具现化”形成

解决方法:

将每个non-local static 对象搬到自己的专属函数内(该对象在函数内被声明为static),返回一个reference指向所含对象.用户调用函数,而不直接指对象。

就是non-local对象被 local static对象替换了,这是Singleton模式的常见实现手法

优势:C++保证,函数内的local static对象会在“该函数被调用期间”“首次遇上该对象定义式”时被初始化。如果从未调用这个对象“仿真函数”,就不会引发构造和析构成本

总之

  • 为内置型对象进行手工初始化,C++并不保证初始化它们
  • 构造函数最好用成员初值列,而不是构造函数内赋值。初值列的成员变量排列次序应该与在class声明次序相同
  • 为避免“跨编译单元之初始化次序”问题,以local static替换non-local static对象。
posted @ 2022-04-02 12:34  BailanZ  阅读(22)  评论(0编辑  收藏  举报