C++正在初始化构造函数中的数组
C++ Initializing a array in a constructor
.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个元素将导致未定义的行为。
相关文章:
- 从数组构造一个跨度<shared_ptr<T>><shared_ptr<void>>
- C++从函数指针数组调用函数
- 是否可以就地构造一个固定大小的数组作为函数参数?
- 节点插件 API 将数组作为函数参数传递
- 将字符串数组作为函数参数传递
- 如何在不使用 C++ 中的数组或函数的情况下查找 N 位数字的所有排列
- C++返回反向字符数组的函数
- 类数组插入函数
- 使用数组数组调用 C++ 函数
- 在 c++ 中将数字转换为矢量数组的函数
- 为什么我的数组或函数不起作用?
- 带有函数指针的数组构造函数
- 对象的数组-STD ::数组 - 构造函数初始化问题
- 将对象类型传递到std ::数组构造函数
- std::initializer_list 作为 std::数组构造函数
- 如何为我的类创建数组构造函数
- Constexpr类与数组构造函数方法
- 列表数组-构造函数和main()中的地址不匹配
- 数组构造函数继承
- 不安全的模板数组构造函数