C++:编译器抱怨构造函数中的变量初始化

Mar*_*aux 1 c++ constructor initialization

我在我的标题"Test.h"中有一个类的变量,它没有没有参数的构造函数.我有一个像这样的构造函数:

Test::Test() // <-- Here he complains:
             // error: no matching function for call to ‘Beer::Beer()’
{
   int i = 2;
   theVar = Beer(1, i); // Beer(int, int) is the only constructor
}
Run Code Online (Sandbox Code Playgroud)

但我正在构造函数体中的(空)初始化列表之后初始化它.

我怎么解决这个问题?如果它有一个名字,这个问题怎么称呼?

谢谢

jal*_*alf 14

您需要使用初始化列表.

Test::Test() : theVar(1, 2) {}
Run Code Online (Sandbox Code Playgroud)

如果问题是i某些其他函数调用的结果,你可以做一些像

Test::Test() : theVar(1, compute_i()) {}
Run Code Online (Sandbox Code Playgroud)

问题是在初始化所有成员之后执行构造函数体.

首先通过调用初始化列表中指定的构造函数来初始化它们,如果该成员未在其中列出,则通过调用其默认构造函数来初始化它们.

这就是为什么你得到错误抱怨Beer::Beer():因为没有指定其他内容,它试图调用该构造函数进行初始化theVar,并且它不存在.

然后初始化所有成员之后,执行构造函数体(执行赋值,而不是初始化)theVar.但编译器永远不会那么远,因为它无法执行初始化.