以下代码:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
struct Test
{
string Str;
Test(const string s) :Str(s)
{
cout<<Str<<" Test() "<<this<<endl;
}
~Test()
{
cout<<Str<<" ~Test() "<<this<<endl;
}
};
struct TestWrapper
{
vector<Test> vObj;
TestWrapper(const string s)
{
cout<<"TestWrapper() "<<this<<endl;
vObj.push_back(s);
}
~TestWrapper()
{
cout<<"~TestWrapper() "<<this<<endl;
}
};
int main ()
{
TestWrapper obj("ABC");
}
这是我在MSVC ++编译器上得到的输出:
TestWrapper()0018F854
ABC测试()0018F634
ABC~Test()0018F634
~TestWrapper()0018F854
ABC~Test()003D8490
为什么只有两个Test析构函数调用,尽管只创建了一个Test对象。两者之间是否创建了临时对象?如果是,为什么没有调用其相应的构造函数?
我错过了什么吗?
答案 0 :(得分:6)
您的输出不考虑Test的复制构造函数,std::vector
易于使用。
您看到的Test对象是临时传递给push_back()
的,而不是vector
中实际存在的那个。
答案 1 :(得分:2)
我认为
vObj.push_back(s);
涉及s
到Test
的隐式演员。所以实际发生的是
vObj.push_back(Test(s));
,临时对象在复制到向量后会被破坏。
向量中的对象是使用复制构造函数(而不是(const string s)
构造函数)构造的,这就是为什么你没有看到对应于析构函数调用的任何构造函数调用。
答案 2 :(得分:2)
尝试将复制构造函数添加到Test:
Test(const Test &obj)
{
cout<<obj.Str<<" Test() "<<this<<endl;
Str = obj.Str;
}
您也会看到正在调用复制构造函数,此调用在将对象放入向量时发生。所以我们有两个构造函数调用和两个析构函数调用。