我应该在构造函数或成员方法中进行大量的初始化工作吗?

时间:2018-04-25 04:03:22

标签: c++

我应该在构造函数或成员方法中进行大量的初始化工作吗?

 class A {
 public:
    A() {
        //a lot of initialization work...
    }
    ~A() = default;
    //or put those work in it
    void init() {
        /*
         After creating object of this class, I invoke
         init method to do some heavy initialization work...
        */
    }
 }

1 个答案:

答案 0 :(得分:3)

我非常喜欢以下方式来看待这个问题,但正如本文最后提到的那样,它有一个单一的,巨大的缺点:

构造函数的工作是建立类不变量

类不变是一个类在调用公共成员函数之间可以处于合法状态的描述,并且每个公共成员函数都应该适用于所有可能的行为不变的国家。因此,尽可能严格地保持班级不变量是一个好主意。

鉴于这一切:在构造函数中完成的工作量应该是尽可能合理地设置为类的严格不变量所需要的。

例如:

如果我有一个包含指向OS窗口的指针的类:

class Window {
  native_window* w_;
  ...
};

类不变量可能是" w_始终为null,或指向窗口的实例。",但这很烦人,因为这意味着大多数成员函数将不得不执行空检查。如果不变量是" w_指向有效的窗口句柄",那么你可以依赖这个假设并大大简化其余的类。

然而!这意味着如果构造函数无法建立不变量(由于原因导致创建窗口的OS调用失败),那么处理失败的唯一方法是抛出异常。因此,如果您在不允许例外的代码库中运行,那么整个类设计方法都没有实际意义。