【问题标题】:Must I initialize everything in the constructor?我必须初始化构造函数中的所有内容吗?
【发布时间】:2016-09-06 02:01:36
【问题描述】:

我相信任何未初始化的东西都会自动初始化,这有点危险(而且实践不佳)。我也知道初始化列表通常更有效(在某些情况下是必要的),但是,我想通过函数调用验证一些参数,然后再将它们分配给成员变量。

例如,使用典型的赋值构造函数,我会有这样的东西:

class MyObj
{
    private:
        int one_;
        int two_;
        DiffObj diffObj_;

    ... // other stuff
}

MyObj::MyObj(int a, int b, std::string type, std::vector<double> params)
{
    one_ = a;
    two_ = b;
    if (verifyType(type, params))
    {
        diffObj_ = createDiffObj(params);
    }
}

在这种情况下,我该如何使用初始化列表?我想也许可以通过初始化构造函数中的一些参数并使用单独的调用来初始化其余参数,但我不太确定这是否符合规定。

MyObj::MyObj(int a, int b) :
    one_(a),
    two_(b)
    {}

MyObj::initializeDiffObj(std::string type, std::vector<double> params)
{
    if (verifyType(type, params))
    {
        diffObj_ = createDiffObj(params);
    }
}

【问题讨论】:

  • 没有必要为任何东西指定初始化。正如您所说,如果您不指定,那么成员将是默认构造的,在许多情况下这很好。如果需要,您可以通过在第二个代码块中调用成员函数来初始化初始化器列表中的一些成员和构造函数主体中的其余成员。
  • “我知道……”后面似乎总是有错误的陈述
  • @M.M:“我认为......”可能会更好
  • 如果verifyType 失败,您对diffObj_ 的计划是什么? diffObj 有自己的默认构造函数吗?
  • @ChrisStathis:在大括号中包含一个列表和其余部分在语法上是否正确?

标签: c++ constructor initialization


【解决方案1】:

这样的事情是完全合理的。你可以有一个初始化列表并在你的构造函数中做一些工作,你不必选择一个。

 class MyClass {
     public:
         MyClass(int a, SomeStruct b)
          : _a(a) {
              if (isValid(b)) {
                   // Initialize _b
                   _b = createWeirdThingFromSomeStruct(b);
              }
         }
     private:
         int _a;
         WeirdThing _b;
};

【讨论】:

  • 这正是我不确定的。谢谢!
【解决方案2】:

如果您的构造函数没有为成员提供初始化程序,则该成员是默认初始化的。对于int,这意味着根本没有初始化;对于具有用户提供的构造函数的类类型,这意味着调用该构造函数。

理想情况下,构造函数初始化器列表应该完成所有成员的初始化。这是针对您的情况的一种方法:

MyObj::MyObj(int a, int b, std::string type, std::vector<double> params)
    : one_(a), two_(b), 
      diffobj( verifyType(type, params), std::move(params) )
{
}

diffobj 的初始化过程中,这个(ab) 使用逗号运算符来适应对verifyType 的调用。如果验证失败,verifyType 函数应该抛出异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 2014-07-02
    • 2013-11-03
    • 1970-01-01
    相关资源
    最近更新 更多