.cpp文件:
Person::Person(int _id[9], string name, int age) :_age(age), _name(name){};
.h文件:
private:
int _id[9];
string _name;
int _age;
我该如何像对待年龄和姓名一样初始化“id”字段?
.cpp文件:
Person::Person(int _id[9], string name, int age) :_age(age), _name(name){};
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){}
ids_t
是一个类型名称,与 std::array<int, 9>
相同类型。 - emlai由于无法分配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);
};
id
参数的类型实际上是int*
,因此Person
构造函数的调用者可以传递(使用隐式数组到指针衰减)任意大小的数组、指向单个int
的指针,甚至是nullptr
,正如这里所示。试图从这些无效的参数中复制9个元素将导致未定义的行为。
std::vector<int>
或std::array<int, 9>
。 - Casey