2008-10-22 165 views
43

爲什麼我們不能初始化結構中的成員?爲什麼我們不能初始化結構中的成員?

例如:

struct s { 
    int i = 10; 
}; 
+1

因爲這是一個定義,而不是聲明 – Archmede 2017-05-01 23:18:05

+1

隨着最近C++,我們可以 - 見下面的答案。 (最近在近幾十年來C++)。我知道這個問題被重新標記C,而C++的答案是我們很多人都在尋求的...... – sage 2017-06-20 16:22:56

回答

34

如果你想在struct聲明初始化非靜態成員:

在C++(不是C),structs幾乎是同義類,可以有成員在構造函數中初始化。

struct s { 
    int i; 

    s(): i(10) 
    { 
    } 
}; 

如果你想初始化實例

在C或C++:

struct s { 
    int i; 
}; 

... 

struct s s_instance = { 10 }; 

C99也有一個功能叫做指定初始化:

struct s { 
    int i; 
}; 

... 

struct s s_instance = { 
    .i = 10, 
}; 

有也是一個非常類似於C99 desi的GNU C擴展gnated初始化,但最好使用一些更便攜:

struct s s_instance = { 
    i: 10, 
}; 
+0

能否請您詳細說明您的最後一個例子嗎? – barnes 2016-02-03 04:01:48

8

編輯:問題最初是標記c++但發帖者稱它是關於c所以我重新加標籤的問題,我要離開了答案雖然...

C++中的struct只是一個class它默認爲public而不是private成員和繼承。

C++只允許static const積分構件被內聯初始化,其他成員必須在構造函數中初始化,或者如果struct處於初始化列表POD(聲明變量時)。

struct bad { 
    static int answer = 42; // Error! not const 
    const char* question = "what is life?"; // Error! not const or integral 
}; 

struct good { 
    static const int answer = 42; // OK 
    const char* question; 
    good() 
     : question("what is life?") // initialization list 
     { } 
}; 

struct pod { // plain old data 
    int answer; 
    const char* question; 
}; 
pod p = { 42, "what is life?" }; 
32

直接的答案是,因爲結構的定義聲明瞭一個類型,而不是可以被初始化的變量。你的例子是:

struct s { int i=10; }; 

這沒有聲明任何變量 - 它定義了一個類型。要聲明一個變量,您將添加一個名字};之間,然後你會算賬初始化:

struct s { int i; } t = { 10 }; 

如跳棋指出,在C99,你也可以使用指定的初始化程序(這是一個美妙的改進 - 有一天,C將趕上Fortran 66用於數據初始化的其他功能,主要是重複初始化程序可指定的次數)。有了這個簡單的結構,沒有任何好處。如果你有,比如說一個結構,20名成員,僅在需要初始化它們中的一個(比方說因爲你有一個標誌,指示該結構的其餘部分是或不是,初始化),它是比較有用的:

struct s { int i; } t = { .i = 10 }; 

這個符號也可以用來初始化工會,選擇哪個工會的元素被初始化。

2

我們不能初始化,因爲當我們宣佈比任何結構實際上我們做什麼,只是告訴編譯器有關他們的存在即不分配內存,如果我們沒有內存,以便初始化成員。通常,當我們初始化任何取決於我們聲明變量編譯器爲該變量分配內存的地方時,會發生什麼情況。

int a = 10; 
  • 如果是自動比堆棧內存要分配
  • ,如果它是全球比數據部分內存要分配

那麼什麼需要存儲器來保存數據,但在結構的情況下沒有內存,所以不可能初始化它。

+1

雖然你的答案看起來不錯,但你應該嘗試使它更清晰,例如糾正你的措辭! – gsamaras 2016-03-14 18:20:09

8

注意,在C++ 11,以下聲明現在允許:

struct s { 
    int i = 10; 
}; 

這是一個老問題,但它在谷歌排名高,不妨加以澄清。

0

正如你所說的,它只是一個成員不是一個變量。當你聲明一個變量時,編譯器也會爲那些你可以放置值的變量提供內存空間。在一個struct成員的情況下,編譯器沒有爲它提供內存空間,所以除非你創建一個結構類型的變量,否則你不能爲結構成員賦值。

相關問題