typedef struct _MY_STRUCT
{
std::string mystring;
int n1;
int n2;
} MY_STRUCT;
class foo
{
public:
foo():
m_mystruct()
{ }
private:
MY_STRUCT m_mystruct;
};
int main(void)
{
foo oFoo;
// Why doesnt this intialize all data members of foo to NULL/0.
// what is the correct way to get all members of MY_STRUCT to be intialized to NULL/0.
}
回答
你可以做的只是增加一個構造函數來你的結構定義:
typedef struct _MY_STRUCT
{
_MY_STRUCT()
{
n1 = 0;
n2 = 0;
}
std::string mystring;
int n1;
int n2;
} MY_STRUCT;
首先,你不需要做typedef
像這樣的C++。其次,創建一個默認的構造函數的結構:
struct MY_STRUCT
{
std::string mystring;
int n1;
int n2;
MY_STRUCT() : mystring(), n1(), n2() {}
};
這樣的結構成員將默認初始化爲:
std::string
空字符串(通過其默認的構造函數),int
s歸零。
所以下面的成立:
MY_STRUCT ms;
assert(ms.mystring.empty());
assert(ms.n1 == 0);
assert(ms.n2 == 0);
的原因最可能是你使用Visual C++。即使從版本10.0開始,Visual C++也不會正確執行值初始化。你的代碼在g ++ 4.4.1中可以正常工作。
2005年左右,Visual C++並沒有達到標準,這是可以理解的,因爲在C++ 03中C++ 98的初始化規則發生了變化。這是C++ 03中唯一的語言改變,否則這只是C++ 98的「技術勘誤」(C++ 03有時被稱爲TC1,技術勘誤1)。 C++ 03引入了「值初始化」作爲「默認初始化」的泛化,以便使結果更簡單,更簡單,並且對於像你的聚合類,包含POD和非POD成員的類更加實用:with C++ 03規定這些成員都是零初始化或默認初始化,所有這些成員。這是一件非常好的事情。 T'was是Andrew Koenig,他提出這個建議,IIRC,並且因爲Koenig Lookup(a.k.a.ADL,Argument Dependent Lookup)而受到指責。 :-)
但是從2010年開始,Visual C++不能正確地做到這一點是不太可以理解的。
這就是說,你的代碼太可怕了。 :-)
請參閱其他意見以改進代碼,包括定義構造函數的想法,這將解決Visual C++的問題。
乾杯&心連心,
@anonymous downvoter:請解釋你的downvote;它看起來特別聰明。很可能你不熟悉數值初始化。我建議你看看。 – 2014-08-02 01:27:39
- 1. 結構成員初始化
- 2. 結構成員初始化
- 3. 初始化結構的成員函數
- 4. 成員初始化數據結構的成員
- 5. 結構初始化與類成員初始化
- 6. 初始化結構的成員
- 7. 初始化sub-sub結構的成員
- 8. 初始化結構的私有成員
- 9. 在初始化其他成員時跳過結構成員的初始化
- 10. C++恆定結構成員初始化
- 11. C++結構2D串成員初始化
- 12. 初始化所有結構成員
- 13. 名爲成員初始化結構
- 14. C++類構造和成員初始化
- 15. 初始化數據結構
- 16. 初始化成員(其構造函數接受參數)的結構的一類
- 17. 初始化結構是另一種結構的成員ISO C++
- 18. 類成員初始化
- 19. 類成員初始化C++
- 20. 結構/類成員的顯式初始化
- 21. C++靜態結構類型成員的初始化
- 22. 如何用此類的其他成員數據初始化類成員數據?
- 23. 在類構造函數中初始化類成員數組?
- 24. 如何初始化靈活數組成員的結構
- 25. 常量數組類成員初始化
- 26. 非顯式初始化成員在其成員初始化的結構中始終爲0?
- 27. 如何在類中定義結構時初始化結構成員?
- 28. OCaml數據成員沒有初始化
- 29. 初始化數據成員引用++
- 30. 初始化對象數據成員C++
還有其他的方法可以做到這一點,但是這是不夠好現在。 – 2010-10-25 13:37:39
也可以初始化'mystring'。 – Arun 2010-10-26 04:22:49