在构造函数初始化列表中调用非静态函数

Call non-static function in constructor initialization list, C++

本文关键字:调用 静态函数 列表 构造函数 初始化      更新时间:2023-10-16

我目前正在优化我的代码,在初始化我的类时,我想使用以下模式:

class MyClass
{
    MyClass(int x) :
        _x(x),
        _collection(createCollection())
    {
    }
    int functionThatDependsOnTheStateOfTheClass() const
    {
        return _x;
    }
private:
    std::vector<int> createCollection() const
    {
        std::vector<int> collection;
        // The collection is dependent on _x somehow.
        collection.push_back(functionThatDependsOnTheStateOfTheClass());
        return collection:
    }
    const int _x;
    const std::vector<int> _collection;
};

我完全理解让代码隐式地依赖于这样的初始化顺序是危险的,但是代码在其他方面是错误的吗?

注意上面的代码是非常简化的。我想做这件事的原因是:

  1. 我想把_collection标记为const.
  2. functionThatDependsOnTheStateOfTheClass()是我的程序中调用最多的函数之一(根据我的分析器),所以我宁愿不通过传递类的状态作为函数参数来创建开销。

所以我的问题是:我应该像躲避瘟疫一样避免这种模式,还是在某些情况下可以接受?

现在您的代码已经定义好了。类的非静态数据成员的初始化顺序为:

则,非静态数据成员应按其初始化顺序初始化是在类定义中声明的(还是不管顺序如何)

由于_x_collection之前声明,因此_x将被初始化,因此可以在functionThatDependsOnTheStateOfTheClass()中使用。