【问题标题】:Why are initialization lists preferred over assignments?为什么初始化列表优先于赋值?
【发布时间】:2014-05-21 22:34:26
【问题描述】:

看这里:

http://www.learncpp.com/cpp-tutorial/101-constructor-initialization-lists/

作者说:

class Something
{
private:
    int m_nValue;
    double m_dValue;
    int *m_pnValue;

public:
    Something()
    {
        m_nValue = 0;
        m_dValue = 0.0;
        m_pnValue = 0;
    }
};

虽然这没有表现出良好的风格,但它在 C++ 语言的语法中是有效的。

...

什么?为什么风格不好?与作者建议的内容相比,我一直都是这样做的,而且可读性很好:

...

class Something
{
private:
    int m_nValue;
    double m_dValue;
    int *m_pnValue;

public:
    Something() : m_nValue(0), m_dValue(0.0), m_pnValue(0)
    {
    }
};

...

我第一次阅读上述内容时,我什至不认为它是有效的语法。现在我知道在某些情况下您必须使用初始化列表,但在这些情况之外,当赋值似乎更容易阅读和理解时,我为什么要使用它们?

【问题讨论】:

  • 写下你的意思。如果您要初始化,请初始化。
  • 我会说列表始终有效并且不会浪费时间创建默认实例只是为了在之后分配给它,这非常好。
  • @chris ... 无论如何,这可能会被编译器完全优化。但是,是的!
  • 注意在C++11中可以写int m_nValue = 0;
  • @πάνταῥεῖ,绝对不适用于编译器不可见默认构造函数定义的类。不确定是否有相同的 TU 非内联。

标签: c++ coding-style


【解决方案1】:

如果对象有构造函数,那么你的版本调用默认构造函数,然后调用赋值运算符,这与使用构造值调用构造函数相比是浪费时间。有些对象甚至没有默认构造函数。

不管它们是否真的有构造函数,与你的所有变量类型的语法保持一致是有意义的。如果您正在编写类模板,那么您甚至可能不知道他们是否这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 2012-03-11
    • 2022-01-17
    相关资源
    最近更新 更多