【发布时间】:2018-09-11 09:59:50
【问题描述】:
我试图了解 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。
谁能帮我理解这种行为?
【问题讨论】:
-
"我不明白为什么复制的对象的 ID=0,而不是 1。"您的复制构造函数不会复制任何内容...
-
我更喜欢使用复制构造函数成员初始化。所以
A(const A& objToCpy) : Objid(objToCpy.Objid) { cout << "Copying object with id: " << ObjId << endl; }
标签: c++ vector constructor stl copy-constructor