有人可以解释为什么我不能在构造函数体中初始化变量,就像我在成员初始化列表中一样.
class MyClass
{
public:
MyClass();
virtual ~MyClass(void);
private:
std::string test;
};
MyClass::MyClass()
: test("asdf") <-- Case 1: This is OK
{
test("asdf"); <-- Case 2: This is not
}
Run Code Online (Sandbox Code Playgroud)
我问,因为我需要使用第三方类,并通过将某些变量传递到其构造函数来进行初始化.如果我像上面的案例1那样使用它,但在案例2中没有,那就没问题了.
在成员初始化列表中构造对象并在构造函数的主体中为其赋值时,语法会有所不同.
在初始化列表中,它就像你拥有它一样;
MyClass::MyClass()
:test("abcd")
{
//...
}
Run Code Online (Sandbox Code Playgroud)
在正文中,您可以使用赋值语法
test = "abcd";
Run Code Online (Sandbox Code Playgroud)
语法test("asdf");被解析为一个test被调用的函数,该函数的参数为"abcd".
必须记住,如果成员没有默认构造函数,则初始化列表是正确构造成员的唯一位置.一旦构造函数的主体运行,所有成员都以某种方式构造或初始化.如果可能,它们可以被分配(例如,不适用于参考和const成员等),但不能被重建.
您不能在构造函数的主体中初始化变量,因为构造函数的主体在所有基类和成员已经在成员初始化列表中初始化之后运行。它们是隐式默认初始化的,因为您没有在那里列出它们是无关紧要的。
因此,在身体,test("asdf");试图调用operator()上test,这将失败。使用赋值 ( test = "asdf";) 更改其值,或者最好直接在成员初始化列表中对其进行初始化。