C++:成员赋值如何工作

c++: how does memberwise assignment work?

本文关键字:工作 何工作 成员 赋值 C++      更新时间:2023-10-16

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

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

但这意味着什么?

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

没有错误。b如何应对a array?通常array_b = array_a无效。

另一个考试:

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

b如何应对a vec?通过赋值(vec_b = vec_a),构造函数(vec_b = vector<int>(vec_a))或其他神秘的方式?

A b=a;

不是赋值,它被称为复制初始化

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

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

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

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

  • 如果子对象是类类型,则使用该类的复制构造函数;
  • 如果子对象是数组,则以适合元素类型的方式复制每个元素;
  • 如果子对象是标量类型,则使用内置赋值运算符。

如果成员具有复制构造函数,则调用它们。 如果不是,则默认复制构造函数执行等效的 memcpy。 请参阅成员分配和初始化。

对于非指针数组,将复制每个元素。