[英]C++ class initializing list and passing functions
我真的在網上搜索過這個,但從未想出答案。 我知道初始化類的兩種方法,當我嘗試傳遞函數時,其中一種方法不起作用。 你能幫我理解為什么會這樣嗎? 我應該使用什么方法? 提前致謝!
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;
}
編輯:感謝所有回復,這比我想象的要快得多。 第一個例子的輸出似乎是一些隨機的垃圾,我不確定這就是為什么我猶豫要詳細說明輸出。
ac (int i){
a = i;
}
不起作用,因為sh
是使用 a 的未初始化值初始化a
。
當您調用 bind 時會發生綁定。
bind
發生在構造函數初始化列表中。
因此,在你的代碼,當你綁定的功能,你的當前值綁定這a
-除非它是在構造函數初始化列表inititalized這是隨機的。
當您在類初始化中進行時,如果您自己不這樣做,那么由構造函數完成它只是一種捷徑。 這意味着
ac (int i){
a = i;
}
成為
ac (int i) : a(garbage), sh(bind(&func, a)){
a = i;
}
所以,現在我們有一個默認初始化(在這種情況下,意味着它包含垃圾) a
正在使用的功能,所以我們有垃圾。 a
出現在sh
之前的原因是類中聲明的方式,這決定了初始化的順序。
第二個示例的工作原理是構造函數被視為
ac (int i) : a(i), sh(bind(&func, a)){
a = i;
}
現在當我們將a
綁定到func
a
被初始化為一個實際值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.