【问题标题】:C++ initialize an empty list in classC ++在类中初始化一个空列表
【发布时间】:2016-02-07 16:13:30
【问题描述】:

如何将空列表初始化为 C++ 类中的私有成员?我不想提示用户传入一个空列表,而是在创建类的新实例时创建一个。

header.h

class MyClass{
public:
    MyClass();
private:
    list<int> myList;
}

MyClass.cpp

MyClass::MyClass()
    :myList(list<int>){}

这不像写的那样工作,我在这里错过了什么?

【问题讨论】:

  • 尝试删除(list&lt;int&gt;),编译器不再需要该类型。
  • 你的意思是一个空向量?
  • @Jaochim Pileborg 谢谢我相信这是问题所在,虽然我也必须在构造函数中指定它。
  • 完全删除构造函数。列表的默认初始化是一个空列表。

标签: c++ class initialization


【解决方案1】:

你不需要做任何事情。顾名思义,默认构造函数是默认调用的。所以这已经是正确的:

class MyClass{
public:
    MyClass() { }         // c++03
    MyClass() = default; // c++11
private:
    std::list<int> myList;
};

如果你想在成员初始化列表中仍然有myList,你可以通过简单地提供空括号来做到这一点:

class MyClass{
public:
    MyClass()
    : myList() // explicitly use default ctor
   {}
private:
    std::list<int> myList;
};

【讨论】:

  • 感谢您的回复,我知道默认构造函数,但没有意识到将列表声明为私有成员就足够了
  • @LBaelish 它不必是私有的。构造一个类必须构造它的所有成员——如果你没有为成员指定构造函数,则使用默认值。
【解决方案2】:

如果你想选择性地提交一个用户定义的值,你可以使用你的构造函数的初始化列表。此外,将列表默认为空内容。

class MyClass{
public:
    MyClass(list<int> theList = {}) : myList(theList) {}

private:
    list<int> myList;
}

【讨论】:

  • 这会导致不必要的复制。
  • 当然,但是当未设置可选参数时,您可以获得空初始化的额外好处。可选参数是一个完全常见的场景:)。只是为了完整起见添加此选项。
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 2014-10-24
  • 1970-01-01
  • 2022-06-10
  • 2012-12-31
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
相关资源
最近更新 更多