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. C++类构造和成员初始化
- 7. 初始化数据结构
- 8. 初始化成员(其构造函数接受参数)的结构的一类
- 9. 类成员初始化
- 10. 结构/类成员的显式初始化
- 11. 如何初始化灵活数组成员的结构
- 12. 非显式初始化成员在其成员初始化的结构中始终为0?
- 13. 如何在类中定义结构时初始化结构成员?
- 14. C++静态数据成员初始化
- 15. 初始化对象数据成员C++
- 16. OCaml数据成员没有初始化
- 17. 使用构造函数参数初始化类成员
- 18. 没有构造函数的C++类成员初始化
- 19. 默认构造函数不初始化类的实例成员?
- 20. 初始化一个类中的静态数据成员(类)C++
- 21. 如何初始化结构数组成员用C
- 22. 初始化类型结构数组
- 23. 结构类型数组初始化
- 24. 初始化向量的元组类成员初始化列表
- 25. Azure服务结构演员初始化
- 26. 类成员初始化父类
- 27. 一个结构的集合初始化,使用自己的数据成员
- 28. 结构数组初始化
- 29. 结构数组初始化
- 30. 基类构造函数和数据成员初始化的奇怪行为
还有其他的方法可以做到这一点,但是这是不够好现在。 – 2010-10-25 13:37:39
也可以初始化'mystring'。 – Arun 2010-10-26 04:22:49