在许多文章和书籍中提出了许多C++编程最佳实践。以下是与C++类数据成员相关的子集:
考虑具有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类数据成员何时应该初始化,什么时候不需要初始化,以及为什么。谢谢!
发布于 2016-03-12 03:55:21
如果没有类的默认构造函数,则必须在初始化程序列表中对其进行初始化,并且不需要在初始化程序列表中调用默认构造函数。它不是Qt特定的,它是任何类的一般规则。当您有一个默认的构造函数(使用0参数)时,即使您没有在初始化程序列表中调用它,它也会自动调用。
更新:
Q1:上面的MyClass::MyClass()的两个版本是否等效?也就是说,它们是否产生两个内容相同的对象?
是。
Q2:一个版本比另一个版本快吗?
您可以更快地键入第二个版本;-),没有性能差异。
发布于 2016-03-12 10:08:10
不管您显式调用QObject的默认构造函数,还是在创建对象时隐式调用QObject的默认构造函数。
您可以将调试消息放入QObject构造函数代码中,这样您就可以看到,它实际上是开源的!:)
https://stackoverflow.com/questions/35952976
复制相似问题