2012-04-21 187 views
0

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

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

mouseEmuQCursor两类...

当将是mouseEmu构造函数调用,当将是pt默认的构造函数叫什么名字?

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

回答

1

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

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

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

class Wand 
{ 
    mouse mouseEmu; 

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

这样,你的mouseEmu子对象有两个参数的构造函数初始化,pt是其默认的(零参数)构造函数初始化。

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

2

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

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

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

class Wand 
{ 
    mouse mouseEmu; 
    QCursor pt; 

    Wand(): mouseEmu(0,0) {} //empty constructor body with initialization list 
}; 
+0

不只是成员的子对象,底座子也-objects – 2012-04-21 16:02:39

+0

有什么错魔杖::魔杖(){ mouseEmu(0,0);}。 – 2012-04-21 16:11:07

+0

即重新初始化mouseEmu对象因此应该给错误 – CppLearner 2012-04-21 16:13:50

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),作为构建魔杖对象的一部分。调用它们的构造函数(按照在类中声明的顺序)。

注意:如果你定义自己的构造函数。但是,不要显式调用你的会员的构造函数,则成员默认构造函数被隐式调用(建筑构件中的顺序总是声明的顺序。

// 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() {} 
} 
+0

好的..感谢您的回答 – 2012-04-21 16:16:55

+0

这个问题并没有改变成非法的语法,它开始那样。 – 2012-04-21 16:31:31

+0

对不起Loki的困惑,那是我的错... – Jason 2012-04-21 16:38:31