绝对怪异的编译器行为 - 构造函数没有被调用.

Nat*_*man 1 c++ qt constructor declaration

我有一个名为NitroShare::FileServer有两个构造函数的类:

FileServer(QObject * parent = NULL);
FileServer(const Certificate & certificate, QObject * parent = NULL);
Run Code Online (Sandbox Code Playgroud)

第一个构造函数的实现在这里(第29行):

FileServer::FileServer(QObject * parent)
    : QObject(parent), d(new FileServerPrivate(this))
{
    qDebug("Constructor invoked!");
}
Run Code Online (Sandbox Code Playgroud)

此类是另一个名为的类的成员NitroShareClient:

NitroShare::FileServer server;
Run Code Online (Sandbox Code Playgroud)

因此,可以假设在NitroShareClient创建类的实例时将调用上面的第一个构造函数.但事实并非如此.因此,程序崩溃了.

这里是从令人沮丧到真正奇怪的事情:如果我在上面第一行中替换构造函数声明:

FileServer(QObject * parent = NULL) : d(NULL) { qDebug("Constructor invoked!"); }
Run Code Online (Sandbox Code Playgroud)

...... 实际上是调用了构造函数!相同的签名.相同的参数.同样的身体.唯一的区别是函数定义的位置.

谁能解释一下这里发生了什么?如果它有帮助,我在Linux上使用GCC 4.7.

Jes*_*ood 5

技术上的积分应该去Mark Bjogojapan指出问题所在.编译器使用构造函数来处理此处FileServer发现的违反单定义规则的其他类.