以下是C++中向量推回方法的签名。C++向量推回方法和临时对象创建
void push_back (const value_type& val);
现在下面是代码
class MyInt
{
int *a;
public:
MyInt(int n):a(new int(n)){cout<<"constructor called"<<endl;}
~MyInt(){cout<<"destructor called"<<endl;}
void show(){
cout<<*a<<endl;
}
};
void vector_test(vector<MyInt> &v)
{
MyInt m1(1);
MyInt m2(2);
v.push_back(m1);
v.push_back(m2);
}
Output
-------------
constructor called
constructor called
destructor called
destructor called
destructor called
1
2
destructor called
destructor called
在这里,我们看到,这是在vector_test函数创建2名对象造成2倍 构造函数调用。 但是对于析构函数,它被调用了5次。
现在我的疑惑和问题
- 怎么会的构造函数和析构函数调用数不匹配?
- 我知道有一些临时对象被创建。但是这个机制是如何工作的?
- 只是为了测试,我试图提供一个复制构造函数,但它会导致编译失败。可能是什么原因?
- 是否有一些内部的逻辑将m1和m2的内容复制到新对象中并放入容器中?
我真的很感激,如果有人解释这一点的细节。谢谢..
您错过了跟踪复制构造函数(有一个由编译器生成的)。 –
一旦你获得了复制构造函数的编写和跟踪,请注意对象创建和销毁的次数取决于编译器,编译器优化等。 – PaulMcKenzie
“我试图提供一个复制构造函数,但它会导致编译失败。可能是什么原因?”显示,也许我们可以告诉。否则,最好的人可以说是你可能有语法错误。 – user4581301