带数组参数的构造函数

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::vectorstd::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&lt;int&gt; el, int s) this -&gt; size = s; for(int i = 0; i &lt; this -&gt; size; i++) this -&gt; elemente.push_back(el[i]); 而不是 move @Andrei,不要这样做。 1)您通过副本获取el,但您不使用移动构造函数将该副本存储在您的对象中。复制是多余的:通过 const-reference 获取 el。 2) 循环中的push_backing 会导致冗余重新分配:在循环之前使用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。将其更改为_sizeSize,任何以下划线后跟大写字母开头的名称都将保留为标准

以上是关于带数组参数的构造函数的主要内容,如果未能解决你的问题,请参考以下文章

结构体构造函数使用总结

java怎么调用带参数构造函数

两个构造函数(带 & 不带参数),无输入 -> 无参数运行。跳过上述类中的构造函数

带参数的Java私有构造函数[重复]

构造函数

构造函数