1 c++ constructor destructor vector push-back
#include <iostream>
#include <vector>
using namespace std;
class cMember
{
public:
int id;
cMember();
~cMember();
};
cMember::cMember()
{
cout<<"member constructor\n";
}
cMember::~cMember()
{
cout<<"member destructor\n";
};
class cDirectory
{
std::vector<cMember> memberList;
public:
cDirectory();
~cDirectory();
void Populate();
};
cDirectory::cDirectory()
{
cout<<"directory constructor\n";
}
cDirectory::~cDirectory()
{
cout<<"directory desctructor\n";
}
void cDirectory::Populate()
{
for(int i = 0; i < 2; i++)
{
cout<<"A\n";
cMember t;
memberList.push_back(t);
cout<<"B\n";
}
cout<<"C\n";
}
int main( int argc, const char ** argv )
{
cDirectory dir;
dir.Populate();
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
查看此程序的输出,第二次迭代调用A和B之间的成员析构函数.我假设此调用是重新分配和重新填充的向量,并在重新分配之前销毁其中的成员.
矢量如何破坏物体,而不是构建它们的替代品?
矢量如何破坏物体,而不是构建它们的替代品?
它通过调用对象的复制构造函数而不是用户定义的默认构造函数来构造它们.
也就是说,如果您没有为对象定义一个复制构造函数,编译器将为您隐式定义一个.这也是这种情况.当重新分配向量的缓冲区时,会引发每个对象的复制构造函数,以便在新位置复制对象.如果您定义复制构造函数,则可以看到以下内容:
class cMember {
public:
int id;
cMember();
CMember(cMember const&);
^^^^^^^^^^^^^^^^^^^^^^^^
~cMember();
};
cMember::cMember(cMember const &) {
cout<<"member copy constructor\n";
}
Run Code Online (Sandbox Code Playgroud)