当我创建N个对象的向量时,为什么CTOR不被调用N次?

时间:2017-02-14 13:44:25

标签: c++ vector constructor stl

Here's代码:

#include <iostream>
#include <vector>

class Voice
{
public:
    Voice(int value) {
        std::cout << "ctor: " << value << std::endl;
    }
    ~Voice() {
        std::cout << "delete" << std::endl;
    }

private:
};

int main()
{
    std::vector<Voice> mVoices;
    mVoices = std::vector<Voice>(10, Voice(999));
}   

如果我创建了10个不同的对象,为什么构造函数只调用了1次?

5 个答案:

答案 0 :(得分:9)

该类具有编译器生成的复制构造函数,该构造函数尚未被检测。

答案 1 :(得分:5)

使用时

std::vector<Voice>(10, Voice(999))

你没有告诉编译器制作10 Voice并将它们放入向量中。你告诉它的是一个VoiceVoice(999)),然后将该对象复制到向量中的每个元素。

这意味着您有1个构造函数调用和10个类的复制构造函数调用。由于该类没有复制构造函数,因此编译器提供了一个复制构造函数,但它不会打印任何内容。如果你想看到这些副本,你需要写自己的像

Voice(const Voice& rhs)
{
    std::cout << "copy " << std::endl;
}

答案 2 :(得分:3)

就像Pete已经说过的,C ++使用了你的编译器生成的拷贝构造函数: 将此添加到您的班级:

Voice(const Voice& rhs)
{
    std::cout << "copy " << std::endl;
}

修改你的课程,我希望现在更清楚了:

class Voice
{
public:
    Voice(int value)
     :m_value(value)
    {
        std::cout << "ctor: " << m_value << std::endl;

    }
    Voice(const Voice& rhs)
        :m_value(rhs.m_value)
    {
        std::cout << "copy " << m_value << std::endl;
    }

    ~Voice() {
        std::cout << "delete " << m_value << std::endl;
    }
private:
    int m_value;
};

答案 3 :(得分:3)

您正在调用的std::vector的构造函数是:

explicit vector( size_type count, 
                 const T& value = T(),
                 const Allocator& alloc = Allocator());

“使用值为count的元素的value副本构造容器”。 (source

因此,向量中的元素是Voice(999)副本。不会调用Voice(999)来单独初始化每个元素。

答案 4 :(得分:2)

根据Pete的回答,最好遵循“三个规则”。 :Rule of three

  

如果类需要用户定义的析构函数,则需要用户定义的副本   它几乎是构造函数或用户定义的复制赋值运算符   当然需要这三个。