2011-10-13 148 views
15

我可以在我的类的构造函数中调用成员的构造函数吗?在构造函数中调用类成员的构造函数

让我说如果我有一个类型为foo的成员bar在我的课。我可以在MClass的构造函数中调用bar的构造函数吗?如果不是,那么我怎样才能初始化我的成员栏?

这是初始化构图(聚合)中的成员的问题。

回答

26

是的,当然可以!这就是构造函数初始化列表的用途。这是你需要初始化成员没有缺省构造,以及常量和参考的基本特征:

class Foo 
{ 
    Bar x;  // requires Bar::Bar(char) constructor 
    const int n; 
    double & q; 
public: 
    Foo(double & a, char b) : x(b), n(42), q(a) { } 
    //      ^^^^^^^^^^^^^^^^^^^ 
}; 

您需要进一步的初始化列表指定基类的非默认构造函数派生类构造函数。

3

像这样:

class C { 
    int m; 

public: 

    C(int i): 
    m(i + 1) {} 

}; 

如果您的会员构造想要的参数,你可以通过它们。它们可以是由类构造函数参数和已经初始化的类型构成的表达式。

还记得:成员的初始化顺序是它们在类中声明的顺序,而不是它们在初始化列表中出现的顺序。

2

是的,你可以。这是在你的类的初始化列表中完成的。例如:

class MClass 
{ 

    foo bar; 

public: 

    MClass(): bar(bar_constructor_arguments) {}; 
} 

这将构建bar,在正常情况下传递的参数,参数将是你的类或参数传递给你的构造函数中的其他成员。对于没有无参数构造函数的成员,此语法是必需的。

3

通过初始化列表,如果基类没有默认构造函数。

struct foo{ 
    foo(int num) 
    {} 
}; 

struct bar : foo { 
    bar(int x) : foo(x) 
       // ^^^^^^ initializer list 
    {} 
}; 
6

是的,你可以:

#include <iostream> 

using std::cout; 
using std::endl; 

class A{ 
public: 
    A(){ 
     cout << "parameterless" << endl; 
    } 

    A(const char *str){ 
     cout << "Parameter is " << str <<endl; 
    } 
}; 

class B{ 
    A _argless; 
    A _withArg; 

public: 
    // note that you need not call argument-less constructor explicitly. 
    B(): _withArg("42"){ 
    } 
}; 

int main(){ 
    B b; 

    return 0; 
} 

输出是:

parameterless 
Parameter is 42 

View this on ideone.com

+0

你在没有显式调用参数少成员的构造函数的评论是什么我是寻找。谢谢! – Jaime

相关问题