我对以下语句的第 2 行和第 3 行发生的事情感到困惑。据我了解
line2 ( vector<A> vec2(vec1);
) :对于存储在 vec1 中的每个 A 实例,将调用复制构造函数并将其存储在 vec2 中。让我感到困惑的是,即使我没有指定自定义复制构造函数,默认复制构造函数创建 A 的实例,可能调用 A 和 B 的默认构造函数,但 THEN 实际上正确地将 A 的成员数组的原始值初始化为拷贝和 A 的成员变量 b 的向量的值到拷贝的 B 的向量。那是免费的深度复制。这个对吗?
line3 ( vector<A> vec3 = vec2;
) :默认构造函数将创建 A 的实例,然后调用存储实例的赋值运算符来初始化它,而不是调用复制构造函数。在这里,我再次获得免费的深度复制。
1. vector<A> vec1;
2. vector<A> vec2(vec1);
3. vector<A> vec3 = vec2;
其中 A 的定义如下所示。
class B
{
public:
vector<int> db;
};
class A
{
public:
char data[5];
int x;
B bee;
};
这是证明深度复制正在发生的主要方法
int main()
{
A a, b;
a.data = {'a','b','c','d','\0'};
a.x = 1;
a.bee.db.push_back(99);
a.bee.db.push_back(100);
b.data = {'z','x','y','w','\0'};
b.x = 2;
b.bee.db.push_back(1);
b.bee.db.push_back(2);
vector<A> vec;
vec.push_back(a);
vec.push_back(b);
map<int, std::vector<A>> map1;
vector<A> vec1(vec);
map1[1] = vec1;
std::vector<A> vec2 = map1[1];
cout << vec2[0].data<< endl;
cout << vec2[0].bee.db[0] << endl;
vec2[0].x = 77777;
vec2[0].data = {'c','o','p','y','\0'};
cout << "vec1[0].x: " << vec1[0].x << endl;
cout << "vec1[0].data: " << vec1[0].data << endl;
return 0;
}