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

问题描述

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

为什么

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(), vec.begin() + 1000000, -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++ 的初学者,那就太好了。谢谢

标签: c++arraysvectorinitializer-list

解决方案


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

  • 使用父类的成员初始化列表:
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有一个将 astd::initializer_list作为输入的构造函数,因此此语法实际上将仅使用 2 个值为1000001and的元素创建向量-1,它不会调用 2-param 构造函数来创建向量1000001 个元素的值-1


推荐阅读