我将我的问题简化为以下代码:
#include<iostream>
#include<stdio.h>
#include <list>
using namespace std;
class B
{
public:
B(){
cout<<"Default ctor of B"<<endl;
};
};
class C
{
public:
C()
{
cout<<"Default ctor of C"<<endl;
}
void sayHello()
{
cout<<"Say hello"<<endl;
}
};
class A: public B
{
public:
void fun()
{
c.sayHello();
}
private:
C c;
};
int main(int argc, char** argv)
{
A* a=new A();
a->fun();
delete a;
return 0;
}
当我创建A对象时,我发现没有调用默认构造函数C,但当我调用A::fun()时,它可以正确地调用C::sayHello()。这怎么可能呢?我在特定的工具链下进行了交叉编译,但是如何可能分配对象内存并不调用其默认构造函数的主体?这似乎是明显的编译器错误,难道不是吗?
当我在Fedora上使用GCC编译上述代码时,一切都按预期工作。
编辑:编译器是为Broadcom芯片集成量身定制的GCC-4.2。在执行代码时存在问题的嵌入式系统中,解决方法是向A添加默认的空构造函数。
A(){}
即使在初始化列表中没有明确调用C++对象的默认构造函数也可以进行初始化。
cout
的怪癖在起作用吗? - Grimm The Opinercout
的看法很公正。如果您在C
的构造函数中设置断点会发生什么? - Grimm The Opiner