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

3

.cpp文件:

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

.h文件:

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

我该如何像对待年龄和姓名一样初始化“id”字段?


如何将数组传递给构造函数? - NathanOliver
2
使用 std::vector<int>std::array<int, 9> - Casey
3个回答

2

数组没有拷贝构造函数,此外这个构造函数中的参数_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 );
}

1
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
1
@XEvans 他创建了一个类型别名:现在 ids_t 是一个类型名称,与 std::array<int, 9> 相同类型。 - emlai

1

由于无法分配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个元素将导致未定义的行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接