12

可能重复:
复制控制函数中如何处理 C 数组成员?

如果我不覆盖operator =类的,它将使用默认的成员分配。

但是这是什么意思?

struct A {
    int array[100];
};
A a;
A b=a;

没有错误。怎么b应付aarray?通常array_b = array_a是无效的。

另一个例子:

struct A {
    vector<int> vec;
};
A a;
A b=a;

怎么b应付avec?通过assignment( vec_b = vec_a)、constructor( vec_b = vector<int>(vec_a))还是其他神秘的方式?

4

2 回答 2

9
A b=a;

不是赋值,它被称为Copy Initialization

b调用隐式生成的复制构造函数以从现有对象创建新对象a
隐式生成的复制构造函数制作array成员的副本。

为了完整起见,我将在此处添加来自标记副本的标准引用。

C++03 标准:12.8(复制类对象)

每个子对象都以适合其类型的方式复制:

  • 如果子对象是类类型,则使用该类的复制构造函数;
  • 如果子对象是一个数组,则以适合元素类型的方式复制每个元素;
  • 如果子对象是标量类型,则使用内置赋值运算符。
于 2012-05-05T11:52:11.907 回答
1

如果成员具有复制构造函数,则它们会被调用。如果没有,默认的复制构造函数相当于 memcpy。请参阅成员分配和初始化

在非指针数组的情况下,每个元素都被复制。

于 2012-05-05T11:54:00.783 回答