[英]Constructor calling in c++
只有在创建对象之后,才将内存分配给类中的变量。 那么,如果该类包含一个变量,该变量是另一个类的对象,并且该变量具有构造函数,该怎么办?
class Wand
{
mouse mouseEmu(0,0);
QCursor pt;
};
mouseEmu
和QCursor
是两个类。
什么mouseEmu
调用mouseEmu
的构造函数, mouseEmu
调用pt
的默认构造函数?
如果指定一个,是否有必要调用参数化构造函数?
什么时候调用mouseEmu的构造函数,什么时候调用pt的默认构造函数?
在输入当前对象的构造函数的主体之前,当前构造的对象的所有数据成员和基类子对象都已完全构造。 因此,如果您的类具有用户定义的构造函数,则在执行用户定义的构造函数中的代码时,该类的所有其他子对象都已完成其构造函数。
如果由于某种原因需要为子对象设置用户定义的初始化值,并且该子对象具有非默认构造函数,则可以将初始化列表与当前对象的构造函数一起使用,以将值传递给子对象的构造函数。 例如:
class Wand
{
mouse mouseEmu;
QCursor pt;
Wand(): mouseEmu(0,0) {} //empty constructor body with initialization list
};
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()
{}
创建魔杖对象时,数量为千。 作为Wand对象构造的一部分,它将自动创建并初始化其成员(mouseEmu和pt)。 调用其构造函数(按类中声明的顺序)。
注意:如果定义自己的构造函数。 但是不要显式调用成员的构造函数,然后隐式调用成员的默认构造函数(成员的构造顺序始终是声明的顺序。
// 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() {}
}
那不是合法的C ++语法。 您似乎在声明一个函数,但是0
不是有效的类型标识符。
从类的构造函数(包括编译器生成的构造函数)中调用子对象的构造函数(基和成员变量)。
ctor-initializer-list允许您为子对象构造函数指定参数。 看起来像这样:
class Wand
{
mouse mouseEmu;
QCursor pt;
public:
Wand() : mouseEmu(0,0) {}
};
这样,您的mouseEmu
子对象将使用两参数构造函数初始化,而pt
将通过其默认(零参数)构造函数初始化。
编译器生成的复制构造函数将通过调用复制构造函数并传递要复制的Wand
对象的成员来初始化两个子对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.