这是我的班级
#include <iostream>
#include <vector>
class Base
{
public:
Base (int ind = 3)
:m_ind(ind)
{
std::cout<<"Base ()"<<std::endl;
}
virtual ~Base ()
{
std::cout<<"~Base ()"<<std::endl;
}
};
我在main中尝试了这段代码:
Base(6)//literal base
"Base ()"
"~Base ()"
我尝试在main中运行此代码:
std::vector<Base>vec;
vec.push_back(Base(4));
我的期望是:
Base(4)
并将其存储在vec.at(0)
"Base ()"
"~Base ()"
打印在屏幕上我得到了什么:
Base(4)
并将其存储在vec.at(0)
"Base ()"
"~Base ()"
打印"~Base ()"
这意味着在向量中推送时会删除Base(4)
,但如果vec.at(0)
为Base(它位于向量内并且已被删除),那怎么可能呢?
答案 0 :(得分:3)
当你这样做时
vec.push_back(Base(4));
您创建了一个临时对象。此临时对象将传递给push_back
函数,复制或将移动到函数中(调用复制构造函数或在你的班级中移动构造函数。然后push_back
函数返回并且临时对象被破坏。
稍后当矢量本身被破坏时,矢量内的副本将被破坏。
答案 1 :(得分:0)
您省略了Base
的复制构造函数。虽然您没有写一个,但编译器为您提供了一个默认值。如果添加复制构造函数,您将看到它被调用(将临时Base(4)
复制到向量中时):
#include <iostream>
#include <vector>
class Base
{
public:
Base(int)
{
std::cout<<"Base(int)"<<std::endl;
}
Base(const Base&)
{
std::cout<<"Base(Base)"<<std::endl;
}
virtual ~Base ()
{
std::cout<<"~Base()"<<std::endl;
}
};
int main()
{
std::vector<Base>vec;
vec.push_back(Base(4));
}
这会产生:
Base(int)
Base(Base)
~Base()
~Base()
如果您使用emplace_back
代替push_back
,则您会看到只构建了一个实例;它没有被复制:
int main()
{
std::vector<Base>vec;
vec.emplace_back(4);
}
Base(int)
~Base()