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

C++ Initializing a array in a constructor

本文关键字:数组 构造函数 初始化 C++      更新时间:2023-10-16

.cpp:

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

.h:

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

我该如何用与年龄和姓名相同的方法在"id"文件上进行标记?

数组没有复制构造函数,而且此构造函数中的参数_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 );
}
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){}

由于不能分配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构造函数的调用方可以传递(使用隐式数组到指针衰减)任何大小的数组、仅指向单个int的指针,甚至是nullptr,如这里所示。试图从这些无效参数中复制9个元素将导致未定义的行为。