首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应该在使用之前初始化C++类的Qt类数据成员吗?

应该在使用之前初始化C++类的Qt类数据成员吗?
EN

Stack Overflow用户
提问于 2016-03-12 02:17:51
回答 2查看 1.1K关注 0票数 1

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

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

考虑具有Qt类类型的数据成员的以下类:

代码语言:javascript
复制
class MyClass {
public:
    myClass();
    ~myClass();
private:
    int myInt;
    QString myQString;
    QList<QString> myQList;
    QHash<int, QString> myQHash;
    char * pChar;
};

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

代码语言:javascript
复制
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类数据成员都需要初始化。但我不能百分之百地肯定这一点。一些开发人员认为,通过将所有数据成员放到初始化列表中,我们可以避免忽略一些应该初始化的重要数据成员的初始化。但是,如果这是一个真正的问题,我希望为每个不需要初始化的数据成员添加一个注释行,例如:

代码语言:javascript
复制
MyClass::MyClass() :
    myInt(0), 
    //myQString(),
    //myQList(),
    //myQHash(),
    pChar(NULL) 
{
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-12 03:55:21

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

更新:

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

是。

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

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

票数 6
EN

Stack Overflow用户

发布于 2016-03-12 10:08:10

不管您显式调用QObject的默认构造函数,还是在创建对象时隐式调用QObject的默认构造函数。

您可以将调试消息放入QObject构造函数代码中,这样您就可以看到,它实际上是开源的!:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35952976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档