在constructor中调用类成员的构造函数

calling constructor of a class member in constructor

本文关键字:成员 构造函数 调用 constructor      更新时间:2023-10-16

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

假设在类MClass中有一个类类型为foo的成员bar。我可以在MClass的构造函数中调用constructor of bar吗?如果不是,那么我如何初始化我的成员栏?

这是一个在组合(聚合)中初始化成员的问题。

当然可以!这就是构造函数初始化列表的作用。这是初始化没有默认构造函数的成员以及常量和引用时需要的基本特性:

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) { }
  //                      ^^^^^^^^^^^^^^^^^^^
};

您还需要初始化列表来指定派生类构造函数中基类的非默认构造函数。

可以,

#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

在ideone.com上查看

像这样:

class C {
  int m;
public:
  C(int i):
    m(i + 1) {}
};

如果成员构造函数需要参数,可以传递参数。它们可以是由类构造函数参数和已经初始化的类型组成的表达式。

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

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

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

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

class MClass 
{
  foo bar;
public:
  MClass(): bar(bar_constructor_arguments) {};
}

这将使用传入的参数构造bar。通常,参数将是类的其他成员或传递给构造函数的参数。对于没有无参数构造函数的任何成员都需要此语法。