我真的在网上搜索了这个,但从来没有想出答案。我知道两种初始化类的方法,当我尝试传递一个函数时,其中一种方法不起作用。你能帮我理解为什么会这样吗?我应该使用什么方法?提前谢谢!
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;
}
编辑:感谢所有回复,这比我想象的要快得多。看起来第一个例子的输出是一些随机垃圾,我不确定这就是为什么我犹豫不决细节输出。
答案 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
时,会将其初始化为实际值。