在构造函数中的成员初始化之前执行必要的工作

Doing necessary work before member initialization in constructor

本文关键字:执行 工作 初始化 构造函数 成员      更新时间:2023-10-16

我有一个关于类及其构造函数的设计问题,C++。我来自几年的Java经验。在Java中,我会做这样的事情:我有一个类来管理SQLite数据库作为存储后端。在此类的构造函数中,我将应用程序数据目录的路径作为参数移交。然后,我将查找数据库文件,建立连接,例如加载表的最新条目以进行缓存。

我现在的问题是如何在C++中做到这一点。我这里的主要问题是,当执行到达构造函数的第一个语句时,所有类成员都已经隐式或显式初始化。

我现在的问题是:如果我在使用构造函数参数初始化类成员之前对它们进行一些计算,我将如何在C++中做到这一点?

我已经发现我可以简单地在构造函数中使用赋值来成员,但我也读到你不应该这样做,因为这意味着成员首先使用其默认构造函数初始化,然后再次初始化。

在初始化类成员之前,当您要进行一些计算(例如加载和解析配置文件(时,规范的方式是什么?我宁愿简单地为构造函数提供一个路径,然后使用构造函数中的加载值加载和解析成员初始化。

将计算部分放在单独的函数中:

class C {
  std::string x;
  int y;
  C(int xarg, int yarg);
};
std::string computeX(int xarg, int yarg) {
    ...
  return result;
}
C::C(int xarg, int yarg) : x(computeX(xarg, yarg)), y(yarg) {}

作为"初始化"函数,您可以使用全局函数,在源文件中本地定义的函数(例如在未命名的命名空间中(,甚至可以调用就地定义的lambda。您还可以使用静态成员函数(如果它是私有的(或其中一个参数的成员函数。