0

仅在创建对象后才将内存分配给类中的变量..对吗?那么如果该类包含一个变量,该变量是另一个类的对象并且该变量具有构造函数呢?

class Wand
{
    mouse mouseEmu(0,0);
    QCursor pt;
};

mouseEmu并且QCursor是两个班级...

什么时候是被调用的构造函数,mouseEmu什么时候是被调用的默认构造函数pt

如果我们指定一个,是否有必要调用参数化构造函数?

4

3 回答 3

2

什么时候调用 mouseEmu 的构造函数,什么时候调用 pt 的默认构造函数?

当前构造对象的所有数据成员和基类子对象都在进入当前对象的构造函数体之前完全构造完毕。因此,如果您的类有一个用户定义的构造函数,那么当用户定义的构造函数中的代码执行时,该类的所有其他子对象都已完成其构造函数。

如果由于某种原因您需要为子对象设置用户定义的初始化值,并且该子对象具有非默认构造函数,那么您可以使用带有当前对象构造函数的初始化列表将值传递给子对象的构造函数。例如:

class Wand
{
    mouse mouseEmu;
    QCursor pt;

    Wand(): mouseEmu(0,0) {} //empty constructor body with initialization list
};
于 2012-04-21T16:00:40.963 回答
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()
{}

当你创建一个 Wand 对象时。作为 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() {}
 }
于 2012-04-21T16:08:56.113 回答
1

这不是合法的 C++ 语法。看起来您正在声明一个函数,但0它不是有效的类型标识符。

子对象的构造函数(基类和成员变量)是从类的构造函数中调用的,包括编译器生成的构造函数。

ctor -initializer-list允许您为子对象构造函数指定参数。它看起来像这样:

class Wand
{
    mouse mouseEmu;

    QCursor pt;
public:
    Wand() : mouseEmu(0,0) {}
};

这样,您的mouseEmu子对象将使用双参数构造函数pt进行初始化,并由其默认(零参数)构造函数进行初始化。

编译器生成的复制构造函数将通过调用复制构造函数并传递被复制对象的成员来初始化两个子Wand对象。

于 2012-04-21T16:00:02.100 回答