C++ 在构造函数中初始化数组

Posted

技术标签:

【中文标题】C++ 在构造函数中初始化数组【英文标题】:C++ Initializing a array in a constructor 【发布时间】:2015-11-28 14:44:44 【问题描述】:

.cpp:

 Person::Person(int _id[9], string name, int age) :_age(age), _name(name);

.h :

private:
int _id[9];
string _name;
int _age;

如何以与年龄和姓名相同的方法输入“id”?

【问题讨论】:

相关/重复:How do I pass an array to a constructor? 使用std::vector<int>std::array<int, 9> 【参考方案1】:

数组没有复制构造函数,而且这个构造函数中没有参数_id

 Person::Person(int _id[9], string name, int age) :_age(age), _name(name);

隐式转换为指向作为参数传入的数组的第一个元素的指针。那其实是构造函数的样子

 Person::Person(int *_id, string name, int age) :_age(age), _name(name);

并且指针不保存它是指向单个对象还是指向数组的第一个对象的信息。

因此,您应该在此参数后附加一个参数,该参数将指定底层数组的大小(如果将其作为参数)。

例如

Person::Person(int *_id, size_t id_num, string name, int age) 
    :_id , _age(age), _name(name)

    size_t size = id_num < 9 ? id_num : 9;
    std::copy( _id, _id + size, this->_id );

【讨论】:

【参考方案2】:
class Person

    typedef std::array<int, 9> ids_t;
    Person(ids_t, string name, int age);

private:
    ids_t _id;
    string _name;
    int _age;
;

Person::Person(ids_t id, string name, int age) : _id(id),  _age(age), _name(name)

【讨论】:

你能解释一下你在 typedef 行中做了什么吗? @XEvans 他创建了一个类型别名:现在ids_t是一个与std::array&lt;int, 9&gt;同类型的类型名。【参考方案3】:

由于您无法分配 C 样式的数组,甚至无法用另一个数组进行初始化,因此您可以使用 C++ 样式的数组(可以分配和复制初始化)来简化任务:

array<int, 9> _id;

Person::Person(array<int, 9> id, string name, int age)
: _id(id), _age(age), _name(name)  

或者,如果你坚持使用C风格的数组,你可以将参数数组复制到std::copy的成员数组中:

Person::Person(int id[9], string name, int age) : _age(age), _name(name)

   copy(id, id + 9, _id);
;

但请注意,传递 C 样式的数组是不好的,因为编译器将所有 C 样式的数组参数视为只是指向数组第一个元素的指针。因此id 参数的类型实际上是int*,因此Person 构造函数的调用者可以传递(使用隐式array-to-pointer decay)一个任意大小的数组,一个指向只是一个单个 int,甚至是一个nullptr,如here 所示。尝试从任何这些无效参数中复制 9 个元素将导致未定义的行为。

【讨论】:

以上是关于C++ 在构造函数中初始化数组的主要内容,如果未能解决你的问题,请参考以下文章

C++中数组的构造函数初始化列表

在 C++ 中的类构造函数中初始化结构数组

C++根据构造函数参数初始化数组

防止在 C++ 中构造/初始化数组元素

带有数组的 C++ 构造函数初始化列表

C++ 数组构造函数