回答
如果你想在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,
};
能否請您詳細說明您的最後一個例子嗎? – barnes 2016-02-03 04:01:48
編輯:問題最初是標記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?" };
直接的答案是,因爲結構的定義聲明瞭一個類型,而不是可以被初始化的變量。你的例子是:
struct s { int i=10; };
這沒有聲明任何變量 - 它定義了一個類型。要聲明一個變量,您將添加一個名字}
和;
之間,然後你會算賬初始化:
struct s { int i; } t = { 10 };
如跳棋指出,在C99,你也可以使用指定的初始化程序(這是一個美妙的改進 - 有一天,C將趕上Fortran 66用於數據初始化的其他功能,主要是重複初始化程序可指定的次數)。有了這個簡單的結構,沒有任何好處。如果你有,比如說一個結構,20名成員,僅在需要初始化它們中的一個(比方說因爲你有一個標誌,指示該結構的其餘部分是或不是,初始化),它是比較有用的:
struct s { int i; } t = { .i = 10 };
這個符號也可以用來初始化工會,選擇哪個工會的元素被初始化。
我們不能初始化,因爲當我們宣佈比任何結構實際上我們做什麼,只是告訴編譯器有關他們的存在即不分配內存,如果我們沒有內存,以便初始化成員。通常,當我們初始化任何取決於我們聲明變量編譯器爲該變量分配內存的地方時,會發生什麼情況。
int a = 10;
- 如果是自動比堆棧內存要分配
- ,如果它是全球比數據部分內存要分配
那麼什麼需要存儲器來保存數據,但在結構的情況下沒有內存,所以不可能初始化它。
雖然你的答案看起來不錯,但你應該嘗試使它更清晰,例如糾正你的措辭! – gsamaras 2016-03-14 18:20:09
注意,在C++ 11,以下聲明現在允許:
struct s {
int i = 10;
};
這是一個老問題,但它在谷歌排名高,不妨加以澄清。
正如你所說的,它只是一個成員不是一個變量。當你聲明一個變量時,編譯器也會爲那些你可以放置值的變量提供內存空間。在一個struct成員的情況下,編譯器沒有爲它提供內存空間,所以除非你創建一個結構類型的變量,否則你不能爲結構成員賦值。
- 1. 結構成員初始化
- 2. 結構成員初始化
- 3. 名爲成員初始化結構
- 4. 定義中結構成員初始化的術語是什麼?
- 5. 爲什麼我不能在我的結構中初始化我的字段?
- 6. 初始化結構的成員
- 7. 初始化sub-sub結構的成員
- 8. 初始化結構的成員函數
- 9. 初始化結構的私有成員
- 10. 爲什麼我們不能在Ruby中初始化TrueClass
- 11. 爲什麼靜態數據成員不能被初始化?
- 12. 在初始化其他成員時跳過結構成員的初始化
- 13. 爲什麼我不能在類的成員函數中初始化QThread?
- 14. C++恆定結構成員初始化
- 15. C++結構2D串成員初始化
- 16. 初始化所有結構成員
- 17. 什麼是結構初始化爲C++
- 18. 結構初始化與類成員初始化
- 19. 爲什麼不是我的類構造函數初始化其成員變量?
- 20. C#結構非靜態struct成員不能有初始化器
- 21. 非顯式初始化成員在其成員初始化的結構中始終爲0?
- 22. 爲什麼人們不能在全球初始化我?
- 23. 爲什麼我不能在新的裏面初始化成員變量?
- 24. 成員初始化數據結構的成員
- 25. 爲什麼C++默認初始化不會零初始化非類別成員
- 26. Ruby:爲什麼我的成員沒有設置初始化?
- 27. 初始化結構數組初始化單個元素的所有成員,爲什麼?
- 28. 爲什麼我不能在這裏使用成員初始化列表?
- 29. 爲什麼我不能在類聲明之外初始化非靜態成員?
- 30. 初始化結構是另一種結構的成員ISO C++
因爲這是一個定義,而不是聲明 – Archmede 2017-05-01 23:18:05
隨着最近C++,我們可以 - 見下面的答案。 (最近在近幾十年來C++)。我知道這個問題被重新標記C,而C++的答案是我們很多人都在尋求的...... – sage 2017-06-20 16:22:56