数据成员应该写在构造函数的初始化列表中吗?数组和向量的不同实现?

问题描述

在创建定义大小的向量以在类中进一步使用时,是否有必要将数据成员的构造函数的参数写入我的类的构造函数的初始值设定项列表中?

为什么

class MyHashMap {
public:
    vector<int> vec;
    MyHashMap():vec(1000001) {
        fill(vec.begin(),vec.begin() + 1000000,-1);
    }

有效,但

class MyHashMap {
public:
    vector<int> vec(1000001);
    MyHashMap() {
        fill(vec.begin(),-1);
    }

不起作用并给出类似

错误
Line 4: Char 22: error: expected parameter declarator
    vector<int> vec (1000001);
                     ^

如果使用数组完成相同的实现,

class MyHashMap {
public:
    int data[1000001];
    MyHashMap() {
        fill(data,data + 1000000,-1);
    }

没有问题。

如果有人可以帮助我,我仍然是 C++ 的初学者,那就太棒了。谢谢

解决方法

您不能像您尝试那样使用括号直接在类成员的声明中直接将参数传递给类成员的构造函数。您需要:

  • 使用父类的成员初始化列表:
class MyHashMap {
public:
    vector<int> vec;
    MyHashMap() : vec(1000001,-1) {}
  • 在 C++11 及更高版本中,您可以使用初始化程序:
class MyHashMap {
public:
    vector<int> vec = vector<int>(1000001,-1);
    MyHashMap() = default;
  • 或者,您可以使用花括号代替括号:
class MyHashMap {
public:
    vector<int> vec{1000001,-1};
    MyHashMap() = default;

但是请注意,在最后一种情况下,因为 std::vector 有一个将 std::initializer_list 作为输入的构造函数,所以此语法实际上将仅使用 2 个值为 {{1 }} 和 1000001,它不会调用 2-param 构造函数来创建具有 1000001 个值为 -1 的元素的向量。