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次?
答案 0 :(得分:9)
该类具有编译器生成的复制构造函数,该构造函数尚未被检测。
答案 1 :(得分:5)
使用时
std::vector<Voice>(10, Voice(999))
你没有告诉编译器制作10 Voice
并将它们放入向量中。你告诉它的是一个Voice
(Voice(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
如果类需要用户定义的析构函数,则需要用户定义的副本 它几乎是构造函数或用户定义的复制赋值运算符 当然需要这三个。