我可以在Class的构造函数中调用成员的构造函数吗?
如果我的班级bar
中有班级类型foo
的成员MClass
,请说明。我可以在MClass的构造函数中调用bar的构造函数吗?如果没有,那么我该如何初始化我的会员栏?
这是在合成(聚合)中初始化成员的问题。
答案 0 :(得分:35)
是的,当然可以!这就是构造函数初始化列表的用途。这是初始化没有默认构造函数的成员以及常量和引用所需的基本功能:
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) { }
// ^^^^^^^^^^^^^^^^^^^
};
您还需要初始化列表来为派生类构造函数中的基类指定非默认构造函数。
答案 1 :(得分: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
答案 2 :(得分:3)
像这样:
class C {
int m;
public:
C(int i):
m(i + 1) {}
};
如果您的成员构造函数需要参数,则可以传递它们。它们可以是由类构造函数参数和已初始化类型构成的表达式。
记住:成员按照在类中声明的顺序进行初始化,而不是它们在初始化列表中出现的顺序。
答案 3 :(得分:3)
通过初始化列表,如果基类没有默认构造函数。
struct foo{
foo( int num )
{}
};
struct bar : foo {
bar( int x ) : foo(x)
// ^^^^^^ initializer list
{}
};
答案 4 :(得分:2)
是的,你可以。这是在您的类的初始化列表中完成的。例如:
class MClass
{
foo bar;
public:
MClass(): bar(bar_constructor_arguments) {};
}
这将使用传入的参数构造bar
。通常,参数将是您的类的其他成员或传递给构造函数的参数。任何没有无参数构造函数的成员都需要此语法。