有人可以解释为什么我不能在构造函数体中初始化变量,就像在成员初始化列表中一样。
我问我是否需要使用第三方类,并通过将某些变量传递到其构造函数来进行初始化。如果我像上面的案例1那样使用它,但不像案例2那样使用它。
答案 0 :(得分:8)
语法在constructing an object in the member initialisation list之间变化,并在构造函数的主体中为其赋值。
在初始化列表中,它就像你拥有它一样;
MyClass::MyClass()
:test("abcd")
{
//...
}
在正文中,您可以使用赋值语法
test = "abcd";
语法test("asdf");
被解析为名为test
的函数,使用"abcd"
参数调用。
必须记住,如果成员没有默认构造函数,则初始化列表是正确构造成员的唯一位置。一旦构造函数的主体运行,所有成员都以某种方式构造或初始化。如果可能,可以将它们分配(例如,不适用于参考文献和const
成员等),但不能重建。
答案 1 :(得分:4)
您无法在构造函数体中初始化变量,因为构造函数的主体在所有基类之后运行,并且成员已在成员初始化列表中初始化了 。它们是默认初始化的,因为你没有列出它们是无关紧要的。
因此,在正文中,test("asdf");
尝试在operator()
上调用test
,但失败了。使用赋值(test = "asdf";
)来更改其值,或者更好地直接在成员初始化列表中初始化它。
答案 2 :(得分:2)
您有以下方法来初始化构造函数中的变量:
ServiceLoader.load(YourInterface.class).iterator().next().getTargetUsername();
方式1:
class MyClass
{
public:
MyClass();
virtual ~MyClass(void);
private:
std::string test;
};
方式2:
MyClass::MyClass() : test("asdf")
{
}
答案 3 :(得分:1)
test(" asdf")是一个函数调用,你不能调用这样的字符串。初始化列表("案例1和#34;)是一种特殊情况。
在构造函数体中,只需使用赋值
test="asdf".
在这种情况下,首先字符串测试是默认构造的(变为空)然后构造一个新字符串并分配给成员测试。
答案 4 :(得分:0)
您无法在构造函数体中初始化成员,因为它已在该点初始化,并且语法反映了这一事实。这已经回答了,但我想指出另一件事 - 不恰当地使用术语可能会导致错误的代码。所以有些人说"你可以通过赋值"在构造函数体中初始化。为什么这是错的?让我们看一下这个例子:
struct foo {
int i = 0;
int &r = i;
foo() {}
foo( int &ref );
};
如果调用该ctor,您希望r
指向与ref
相同:
foo::foo( int &ref ) : r( ref )
{
}
现在如果您尝试"初始化"会发生什么?通过转让:
foo::foo( int &ref )
{
r = ref;
}
所以现在不是将int
引用r
指向与int
相同的ref
,而是将其分配给成员i
。这可能导致难以捕捉到错误和士气:"术语在编程中很重要,你不应该随意玩它"