只有在创建对象后才将内存分配给类中的变量。 那么如果类包含一个变量是另一个类的对象而变量有一个构造函数呢?
class Wand
{
mouse mouseEmu(0,0);
QCursor pt;
};
mouseEmu
和QCursor
是两个类......
何时调用mouseEmu
的构造函数,何时调用pt
的默认构造函数?
如果我们指定一个,是否需要调用参数化构造函数?
答案 0 :(得分:2)
什么时候会调用mouseEmu的构造函数,什么时候才会成为pt的默认构造函数?
当前构造对象的所有数据成员和基类子对象都在输入当前对象的构造函数的主体之前完全构造。因此,如果您的类具有用户定义的构造函数,那么在执行用户定义的构造函数内部的代码时,该类的所有其他子对象的构造函数都已完成。
如果由于某种原因需要为子对象设置用户定义的初始值,并且该子对象具有非默认构造函数,则可以使用包含当前对象的构造函数的初始化列表将值传递给子对象的构造函数。例如:
class Wand
{
mouse mouseEmu;
QCursor pt;
Wand(): mouseEmu(0,0) {} //empty constructor body with initialization list
};
答案 1 :(得分:2)
class Wand
{
mouse mouseEmu(0,0);
// ^^^^^^ This bit is illegal.
// Remove it here. You specify the parameters
// Passed to members in the constructor.
QCursor pt;
};
你想要的是:
class Wand
{
Ward(): mouseEmu(0,0) {}
mouse mouseEmu;
QCursor pt;
};
在问题变为非法之前根据问题回答。
如果您没有提供构造函数,那么编译器会为您构建一个隐式默认构造函数:
Wand::Wand()
: mouseEmu()
, pt()
{}
当你创建一个魔杖对象时。它将自动创建和初始化其成员(mouseEmu和pt),作为构建Wand对象的一部分。调用它们的构造函数(按类中声明的顺序)。
注意:如果您定义自己的构造函数。但是,不要显式调用你的成员的构造函数,然后隐式调用成员默认构造函数(成员构造的顺序是总是声明的顺序。
// Example:
// If you did:
class Wand
{
Wand(int x) : mouseEmu(0,x) {}
// The above will generate this logical code.
Wand(int x) : mouseEmu(0,x), pt() {}
}
答案 2 :(得分:1)
这不是合法的C ++语法。看起来您正在声明一个函数,但0
不是有效的类型标识符。
从类的构造函数中调用子对象(基础和成员变量)的构造函数,包括编译器生成的构造函数。
ctor-initializer-list 允许您为子对象构造函数指定参数。它看起来像这样:
class Wand
{
mouse mouseEmu;
QCursor pt;
public:
Wand() : mouseEmu(0,0) {}
};
这样,您的mouseEmu
子对象使用双参数构造函数初始化,pt
由其默认(零参数)构造函数初始化。
编译器生成的拷贝构造函数将通过调用copy-constructors并传递正在复制的Wand
对象的成员来初始化这两个子对象。