C ++类初始化列表和传递函数

时间:2016-03-01 20:27:44

标签: c++ function class pointers initialization

我真的在网上搜索了这个,但从来没有想出答案。我知道两种初始化类的方法,当我尝试传递一个函数时,其中一种方法不起作用。你能帮我理解为什么会这样吗?我应该使用什么方法?提前谢谢!

void func(int i){
    cout << "GG " << i; 
}

class ac{
public:
    int a;
    function<void()> sh = bind(&func, a);

    /*ac (int i){   This does not work
        a = i;
    }*/

    ac (int i) : a(i) {};   // but this does

    void go (){
        sh();
    }
};

int main() {
    ac ac1(5);
    ac1.go();
    return 0;
}

编辑:感谢所有回复,这比我想象的要快得多。看起来第一个例子的输出是一些随机垃圾,我不确定这就是为什么我犹豫不决细节输出。

3 个答案:

答案 0 :(得分:0)

ac (int i){
    a = i;
}

由于使用未初始化的sh值初始化a,因此无效。

答案 1 :(得分:0)

调用bind时会发生绑定。

bind发生在构造函数初始化列表中。

所以在你的代码中,当你绑定函数时,你将它绑定到a当前值 - 这是随机的,除非它在构造函数初始化列表中被初始化。

答案 2 :(得分:0)

当您在类初始化中进行操作时,如果您不自己完成,那么构造函数完成它只是一个简短的方法。这意味着

ac (int i){
    a = i;
}

变为

ac (int i) : a(garbage), sh(bind(&func, a)){
    a = i;
}

所以现在我们有一个默认初始化(在这种情况下意味着它包含垃圾)a被用于该函数所以我们有垃圾。 a之前sh的原因是,这是类中的declred,它决定了初始化的顺序。

第二个示例在构造函数被视为

时起作用
ac (int i) : a(i), sh(bind(&func, a)){
    a = i;
}

现在,当我们将a绑定到func a时,会将其初始化为实际值。