c++ - 了解将对象插入向量时的构造、复制和销毁
问题描述
我试图了解 STL 如何处理对象的插入。我知道 STL 从临时调用构造函数或复制构造。
这是我试图理解的代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class A
{
public:
int ObjId;;
A(int id) : ObjId(id)
{
cout << "Constructing object with id: " << ObjId << endl;
}
A(const A& objToCpy)
{
ObjId = objToCpy.ObjId;
cout << "Copying object with id: " << ObjId << endl;
}
~A()
{
cout << "Destructing object with id: " << ObjId << endl;
}
};
int main()
{
std::vector<A> vecOfA;
vecOfA.push_back(A(1));
cout << "....................." << endl << endl;
vecOfA.push_back(A(2));
return 0;
}
这给出了以下输出:
构造具有 id: 1 的对象
复制具有 id: 1 的对象
使用 id 破坏对象:1
......
用 id 构造对象:2
复制具有 id: 2 的对象
复制具有 id: 1 的对象
使用 id 破坏对象:1
使用 id 破坏对象:2
......
使用 id 破坏对象:1
使用 id 破坏对象:2
我可以理解第一个插入。创建一个 ID=1 的临时对象,然后将其复制构造并插入到向量中。然后这个临时的就被破坏了。
但是,我不明白为什么复制的对象的 ID=0,而不是 1。
至于第二部分,我不知道发生了什么以及为什么它与第一次插入不同,唯一的例外是 ID 不同。为什么要复制 2 个对象,并且它们的 ID=0,而不是 2。
谁能帮我理解这种行为?
解决方案
在第一种情况下,您让ObjId未初始化,这意味着您很幸运插入了 0,但基本上也可以有任何可见的值。
通过键入A(const A& other) {...}
,您定义了自己的复制构造函数,这意味着您显示了每个字段是如何复制的,因此您错过ObjId = other.ObjId
了构造函数中的语句。
发生第二种情况是因为您的向量正在调整大小,因此它必须将所有元素从旧存储复制到新的更大的存储,该存储也将适合新元素。
推荐阅读
- codeigniter - Codeigniter 框架:我们如何跟踪给定“视图”php 代码片段中的变量来自何处?
- javascript - 如何使用 JS 向一个元素添加多个类?
- visual-studio-code - 左键移回上一行的末尾
- sql - 在 postgreSQL 中提供路由的递归查询
- charts - 是否可以在不累加系列的情况下使用堆积柱形图?
- javascript - 将键值对从数组添加到 javascript 对象的问题
- php - 我无法在 fancybox-3 上预览缩略图
- c++ - 枚举类的 C 样式转换为底层类型 char 的引用
- javascript - 将待办事项发布到我的数据库 - 它适用于 Postman
- javascript - 如何在php中嵌套双引号