【问题标题】:Zero initialising class member which is a struct in C++11零初始化类成员,它是 C++11 中的结构
【发布时间】:2017-06-06 11:02:32
【问题描述】:

我已尝试阅读 C++ 文档,但我发现它很难理解。我喜欢像这样对我的结构进行零初始化:

MyStruct myStruct = {};

但是如果我有这个结构作为类成员,我如何在构造函数中进行零初始化?

struct MyStruct
{
 int x;
 int y;
}

class MyClass
{
 MyStruct mMyStruct;
public:
 MyClass();
} 



// is this fine?
MyClass::MyClass()
 : mMyStruct()
{}

// or this?
MyClass::MyClass()
 : mMyStruct({})
{}

// or do I need this?
MyClass::MyClass()
 : mMyStruct()
{
 mMyStruct = {};
}

【问题讨论】:

  • 为什么你有强迫性地对所有东西进行零初始化?如果特定类的实例应该始终初始化为零,那么这应该由该类的默认构造函数完成。
  • 你忘记了一个变种MyClass() : myStruct{} {}
  • 这个问题是this one 的一个微妙变体。我可以有力地证明它们是重复的,但不足以行使我的单方面投票权。
  • 但是由于XY问题太常见了,检查也不是没有道理的。
  • @SamVarshavchik 当我尝试它们时,它们都可以工作,但是 a) VS 通常对你的零初始化非常宽容,但是优化级别可以改变这一点,并且 b) 我想确定什么我写的是正确和便携等。

标签: c++ c++11 struct


【解决方案1】:

一种方法是:

class MyClass
{
    MyStruct mMyStruct = {};
public:
    MyClass();   // actually unnecessary
};

【讨论】:

  • 如果没必要就不要写了。
  • @IInspectable:如果出现其中任何一种情况,代码就不再是“多余的”或“不必要的”,所以这一点变得没有意义。
  • @BoundaryImposition 如果没有人写不必要的东西,这不会是评论。
  • @Yakk:不明白你的意思。
  • 我来这里不是为了人身攻击,@IInspectable。也许您可以改写您的评论,以便在不求助于任何人的情况下表达您的观点?
【解决方案2】:

你可以使用符号

MyClass::MyClass()
 : mMyStruct{}
{
}

http://en.cppreference.com/w/cpp/language/initializer_list

你知道那个文档还不错。

【讨论】:

  • 很酷,但只是因为我很好奇,我的问题中的前两个是否有效?
  • “你知道那个文档还不错。” 真的吗?这并不容易理解,特别是对于不是 C++ 标准专家的人。再说一次,人们可能会对语言本身说同样的话!
  • @boundary wiki 有一个讨论部分。请在那里报告您的疑虑。我看到周围有很多知名用户很乐意改进。
猜你喜欢
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 2021-12-03
  • 1970-01-01
  • 2011-05-03
相关资源
最近更新 更多