Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么初始化列表优先于分配?_C++_Coding Style - Fatal编程技术网

C++ 为什么初始化列表优先于分配?

C++ 为什么初始化列表优先于分配?,c++,coding-style,C++,Coding Style,请看这里: 作者说: 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;
    }
};
<>虽然这不显示好的风格,但它在C++语言的语法中是有效的。

什么?为什么它不是好的风格?我一直都是这样做的,与作者的建议相比,它是完全可读的:


当我第一次读到上面的内容时,我甚至没有意识到它是有效的语法。现在我了解到有些情况下您必须使用初始化列表,但除了这些情况之外,当赋值看起来更容易阅读和理解时,为什么我要使用它们?

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


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

写下您的意思。如果你想初始化,那就初始化。我想说的是,列表始终有效,而且不浪费时间创建一个默认实例来分配给它,这非常好。@chris。。。无论如何,编译器可能会对其进行优化。但是,是的!注意,在C++11中,您可以编写
intm\u nValue=0@πάνταῥεῖ, 对于默认构造函数定义对编译器不可见的类,肯定不是这样。不确定是否有相同的TU非内联的。
class Something
{
private:
    int m_nValue;
    double m_dValue;
    int *m_pnValue;

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