【问题标题】:Struct default constructor: will it initialize my members with default vaues i.e. 'zeros' [duplicate]结构默认构造函数:它会用默认值初始化我的成员,即“零”[重复]
【发布时间】:2016-11-21 19:43:32
【问题描述】:

我正在学习构造函数,我需要澄清一下。我可以在不指定构造函数的情况下构建如下结构:

 struct MyStruct {
 int member;
 }

当我创建此结构的对象时,生成的默认构造函数不会将member 初始化为默认值,除非在用户定义的构造函数中明确说明,对吗?这样:

MyStruct object;
cout<<object.member<<endl;

将根据运行时存储在该内存地址中的内容输出一些随机值,对吗?

我的最后一个问题是,如果我没有显式声明和定义构造函数,生成的构造函数会在我创建 MyStruct 的对象时初始化 member 还是 member 未初始化?

【问题讨论】:

标签: c++ struct constructor language-lawyer


【解决方案1】:

是的,编译器生成的构造函数不会初始化内置类型。

编译器生成的构造函数完全一样:

MyStruct() {}

访问MyStruct.member 会导致未定义的行为。你应该显式初始化member

MyStruct() : member(0) {}

【讨论】:

  • 另外,我建议使用 C++ 静态分析工具,例如 CppCheck 来找出像这样的错误/错误。很有帮助。
  • 感谢您的回复!这绝对解决了问题。
【解决方案2】:

除非你明确地使用“类内初始化器”——比如int member = 0;添加一个初始化成员的构造器,那么它的值将是undefined

它将不是(必然)是运行时存储在内存地址的任何内容。它是未定义;这意味着您不能可靠地使用它并且如果您这样做了,您的编译器可能会利用您随后调用“未定义行为”的事实,并可能基于该事实优化您的程序 - 您肯定会这样做不想。

始终在使用前初始化变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-12
    • 2011-08-09
    • 1970-01-01
    • 2018-11-24
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    相关资源
    最近更新 更多