是否应该在使用C ++类的Qt类数据成员之前进行初始化?

时间:2016-03-12 02:17:52

标签: c++ qt class member-initialization

许多文章和书籍中都提出了许多C ++编程最佳实践。以下是与C ++类数据成员相关的子集:

  1. 确保在使用对象之前对其进行初始化。
  2. 确保所有构造函数初始化对象中的所有内容。
  3. 在每个构造函数的初始化列表中初始化数据成员通常比在其体内初始化更有效。
  4. 在初始化列表中,数据成员应按声明的顺序列出。
  5. 考虑以下具有Qt类类型的数据成员的类:

    class MyClass {
    public:
        myClass();
        ~myClass();
    private:
        int myInt;
        QString myQString;
        QList<QString> myQList;
        QHash<int, QString> myQHash;
        char * pChar;
    };
    

    通过应用上述最佳实践,构造函数代码如下所示:

    MyClass::MyClass() :
        myInt(0),    // OK, primitive should be initialized.
        myQString(),    // Is this really needed?
        myQList(),     // Is this really needed?
        myQHash(),    // Is this really needed?
        pChar(NULL)    // OK, pointer should be initialized.
    {
    }
    

    但是,我的印象是并非所有Qt类数据成员都需要初始化。但我不是百分百肯定的。一些开发人员认为,通过将所有数据成员放在初始化列表中,我们可以避免忽略应该初始化的一些重要数据成员的初始化。但是,如果这是一个真正的问题,我宁愿为每个不需要初始化的数据成员添加注释行,例如:

    MyClass::MyClass() :
        myInt(0), 
        //myQString(),
        //myQList(),
        //myQHash(),
        pChar(NULL) 
    {
    }
    

    总结一下,我想知道什么时候应该初始化Qt类数据成员,何时不需要初始化,以及为什么。谢谢!

2 个答案:

答案 0 :(得分:6)

如果您没有类的默认构造函数,则必须在初始化程序列表中初始化它,并且不需要在初始化程序列表中调用默认构造函数。它不是Qt特定的,它是任何类的一般规则。如果你有一个默认的构造函数(它接受0参数),即使你没有在初始化列表中调用它,它也会被自动调用。

<强>更新

  

Q1:MyClass :: MyClass()的2个版本是否相同?那   是,它们是否生成了2个相同内容的对象?

  

Q2:一个版本比另一个版本快吗?

您可以更快地输入第二个版本;-),没有性能差异。

答案 1 :(得分:0)

无论您是显式调用它还是将调用QObject的默认构造函数,或者在创建对象时隐式调用它。

您可以将调试消息放入QObject构造函数代码中并亲眼看看,为了真实,它是开源的! :)