在类构造函数中初始化成员

时间:2016-07-22 13:45:34

标签: c++

有人可以解释为什么我不能在构造函数体中初始化变量,就像在成员初始化列表中一样。

我问我是否需要使用第三方类,并通过将某些变量传递到其构造函数来进行初始化。如果我像上面的案例1那样使用它,但不像案例2那样使用它。

5 个答案:

答案 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。这可能导致难以捕捉到错误和士气:"术语在编程中很重要,你不应该随意玩它"