C :尝试了解向量和类
c++: try to understand vector and class
我对以下代码感到困惑。
#include <iostream>
#include <vector>
using namespace std;
class A
{
public:
A(int _a) : a(_a)
{
cout << "A(" << a << ") created" << endl;
}
~A()
{
cout << "A(" << a << ") deleted" << endl;
}
int a;
};
void test()
{
vector<A> as;
A a1(1);
A a2(2);
as.push_back(a1);
as.push_back(a2);
cout << "test ended" << endl;
}
int main()
{
test();
return 0;
}
这是输出。
A(1) created
A(2) created
A(1) deleted <== ?
test ended
A(2) deleted
A(1) deleted
A(1) deleted
A(2) deleted
为什么有额外的" a(1)删除"?
我知道执行push_back时存在隐式复制构造。但是,我的问题是为什么A1对A2的处理方式不同?
-
用对象A1调用第一个
vector#push_back
时,它会创建一个使用复制构造函数的对象A1的副本。 -
使用对象A2调用第二个向量#push_back时,它必须用两个对象重新创建向量。因此,它删除已复制的A1对象,创建另一个向量并添加A1和A2的新副本。这就是为什么您会看到A1的第一个删除语句。
-
最后,当您的程序退出时,删除了A1和A2的副本,这就是为什么您会看到每个A1和A2的两个删除语句。
如果创建具有2个元素的初始大小的向量,则会看到为A1和A2创建的对象数量相等。只是做
as.reserve(2);
创建两个对象的向量,以便在按下第二个对象时不必重新创建向量。
另外,如果您定义了自己的复制构造函数,则可以看到何时确切的vector#push_back创建对象的副本:
A(const A &obj) {
a = obj.a;
cout << "A(" << a << ") created in copy constructor" << endl;
}
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 正在尝试了解输入验证循环
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 了解 GLM- openGL 中的相机转换
- 了解向量中的 .begin 和 .end
- 了解向量乘法
- C :尝试了解向量和类
- 了解C 中的向量初始化
- 了解C 中的地图和向量的TypeId.name()输出
- 了解我有多少内存可用于一个动态向量c++
- 了解对象向量的Next_Permutation函数C++