1

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

  1. 确保在使用对象之前对其进行初始化。
  2. 确保所有构造函数都初始化对象中的所有内容。
  3. 在每个构造函数的初始化器列表中初始化数据成员通常比在其主体中更有效。
  4. 在初始化列表中,数据成员应该按照它们被声明的顺序列出。

考虑以下具有 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 类数据成员都需要初始化。但我不是 100% 确定这一点。一些开发人员认为,通过将所有数据成员都放在初始化列表中,我们可以避免忽略一些应该初始化的重要数据成员的初始化。但是,如果这是一个真正的问题,我宁愿为每个不需要初始化的数据成员添加注释行,例如:

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

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

4

2 回答 2

6

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

更新:

Q1:以上两个版本的 MyClass::MyClass() 是否等效?也就是说,它们会产生 2 个相同内容的对象吗?

是的。

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

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

于 2016-03-12T03:55:21.597 回答
0

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

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

于 2016-03-12T10:08:10.653 回答