簡體   English   中英

C++ 類初始化列表和傳遞函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM