【问题标题】:Initializing map and set class member variables to empty in C++?在 C++ 中初始化映射并将类成员变量设置为空?
【发布时间】:2011-05-19 16:06:14
【问题描述】:

我有一个带有两个成员变量的 C++ 类

std::map<int, Node*> a;

std::set<Node*> b;

我的大学使用的样式检查器要求在类的构造函数中初始化所有成员变量。 ab这些成员变量如何在它们所在类的构造函数中初始化为空?

【问题讨论】:

  • 您已经用“这工作,谢谢”评论了两个答案。您现在应该接受一个(如果答案相同,通常是第一个)。 ;)

标签: c++ map coding-style initialization set


【解决方案1】:

当应用 -Weffc++ 警告选项时,此检查由 g++ 编译器执行。 请参阅第 4 项(“确保对象在使用前已初始化” 在 Scott Meyers, Effective C++, Book for more information, 为什么使用成员初始化列表初始化所有成员可能是合理的。 基本上,他建议始终如一地这样做,并且比内部的任务更喜欢这个 构造函数体。

【讨论】:

  • 这如何解释如何做到这一点? Effective C++ 参考资料是很好的研究资料,但不是一个完整的答案。
  • @peachykeen:你说得对,这是一个评论,而不是对最初问题的回答。
【解决方案2】:

由于std::setstd::map 都有“用户”声明的默认构造函数,因此无论您如何构造类,它们都会被隐式初始化。你不需要做任何特别的事情来符合“风格”指南。

【讨论】:

  • 谢谢查尔斯。这里的问题是样式检查是作为自动评分系统的一部分自动完成的,并且需要显式初始化所有成员变量。
  • @Marek Miettinen:您确定样式检查不仅适用于 POD 类型吗?我从未见过风格指南坚持显式初始化具有默认构造函数的东西,这些构造函数无论如何都会用于隐式初始化。
  • 如果样式检查器真的需要,它就坏了,就这么简单。
  • @CharlesBailey 所以只是声明一个 map 类型的成员变量而不在任何构造函数中初始化它会初始化变量吗?在 C# 中,变量指向 null,除非它使用 new 关键字显式初始化。在 C++ 中不是这样吗?
【解决方案3】:

像这样:

class A
{
  public :

  A() : s(),
        m()
  {
  }


  std::set< int > s;
  std::map< int, double > m;
};

【讨论】:

    【解决方案4】:

    喜欢这个SomeClass::SomeClass() : a(), b() {}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      相关资源
      最近更新 更多