带数组参数的构造函数
Posted
技术标签:
【中文标题】带数组参数的构造函数【英文标题】:Constructor with array parameters 【发布时间】:2019-07-05 13:13:40 【问题描述】:我想创建一个具有数组和数组大小的构造函数,这样我就可以使用这个来调用对象:Multime m1 = Multime(1, 2, 3, 3);
或者我应该使用 std::vector 代替吗?
class Multime
private:
int elemente[100];
int size;
public:
Multime()
Multime(int el[50], int s)
this -> size = s;
for(int i = 0; i < this -> size; i++)
this -> elemente[i] = el[i];
;
int main()
Multime m1 = Multime(1, 2, 3, 3);
return 0;
我得到没有匹配的构造函数用于初始化'Multime'
【问题讨论】:
elemente 是否应该始终包含 100 个元素? 使用std::vector
或std::initializer_list
作为参数怎么样?
您确定1, 2, 3
计算结果为整数数组吗?
您不能将数组作为参数传递。有关更多信息,请参阅 C++ 书中解释函数参数类型如何衰减的章节。在 C++11 后的词中,您可以声明 std::initializer_list
参数并避免需要传递显式数组大小参数,这将起作用;但这是一个相当高级的主题,有关详细信息,请参阅您的 C++ 书籍。
顺便说一句,如前所述,您不能将 C 样式的数组作为参数简单地传递。就像在 C 中一样,像 int el[]
(大小无关)这样的参数声明将被视为 int* el
,换句话说,该函数需要一个指针作为参数。您的编译器应该在完整的错误消息中提到它(尽管它可能有点间接)。
【参考方案1】:
或者我应该使用 std::vector 代替吗?
这是个好主意。
class Multime
private:
std::vector<int> elemente;
public:
Multime()
Multime(std::vector<int> el) : elemente(std::move(el))
;
int main()
Multime m1 = Multime( 1, 2, 3 );
return 0;
【讨论】:
如果你使用构造函数初始化列表会更好。 ;) @Someprogrammerdude 好主意。我经常忘记这个功能。 更好:elemente(std::move(el))
.
谢谢,我决定最好使用 std::vector 但我使用 push_back
Multime(vector<int> el, int s) this -> size = s; for(int i = 0; i < this -> size; i++) this -> elemente.push_back(el[i]);
而不是 move
@Andrei,不要这样做。 1)您通过副本获取el
,但您不使用移动构造函数将该副本存储在您的对象中。复制是多余的:通过 const-reference 获取 el
。 2) 循环中的push_back
ing 会导致冗余重新分配:在循环之前使用elemente.reserve(s);
预分配空间。 3)向量的大小不要使用int
,使用std::size_t
并与标准库保持一致。【参考方案2】:
如果您希望您的类能够包含不同数量的元素(在编译时定义),您可以尝试:
#include <array>
template <size_t _Size>
class Multime
private:
int elemente[_Size];
public:
Multime()
Multime(const std::array<int, _Size>& p_elements)
for (int i = 0; i < _Size; ++i)
this->elemente[i] = p_elements[i];
;
int main()
Multime<3> m1(1, 2, 3);
return 0;
你也可以直接将 std::array 存储到你的类中,这样构造更干净
#include <array>
template <size_t _Size>
class Multime
private:
std::array<int, _Size> elemente;
public:
Multime()
Multime(const std::array<int, _Size>& p_elements) : elemente(p_elements)
;
int main()
Multime<3> m1(1, 2, 3);
return 0;
【讨论】:
使用std::array
成员也可以简化构造函数。
由他决定,我不想打破他的逻辑
保留名称_Size
。将其更改为_size
或Size
,任何以下划线后跟大写字母开头的名称都将保留为标准以上是关于带数组参数的构造函数的主要内容,如果未能解决你的问题,请参考以下文章