【问题标题】:c++: how does memberwise assignment work? [duplicate]c++:按成员分配是如何工作的? [复制]
【发布时间】:2012-05-14 17:55:50
【问题描述】:

可能重复:
How are C array members handled in copy control functions?

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

但这是什么意思?

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

没有错误。 b 如何应对 a'sarray?通常array_b = array_a是无效的。

另一个例子:

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

b 如何应对a'svec?通过赋值(vec_b = vec_a)、构造函数(vec_b = vector&lt;int&gt;(vec_a))还是其他神秘的方式?

【问题讨论】:

标签: c++ variable-assignment


【解决方案1】:
A b=a;

不是赋值,它被称为Copy Initialization

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

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

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

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

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

【讨论】:

  • 一般来说是的。什么是数组的浅拷贝?
  • @KonradRudolph:在这种情况下,memcpy浅拷贝将应用于指针,这就是三法则的原因。
  • @Als Word。这也可以应用于 OP 的“通常 array_b = array_a 无效”。你不能使用这样的赋值,但是你可以用这种方式构造新的数组(只要 rhs 是一个数组字面量)。
  • @ChrisA。如果数组元素是指针。
  • @Als 你的意思是这里的浅拷贝和修改对象 a 的数组变量会修改对象 b 的数组变量的内容吗?
【解决方案2】:

如果成员有复制构造函数,它们会被调用。如果不是,则默认的复制构造函数与 memcpy 等效。见Memberwise Assignment and Initialization

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

【讨论】:

    猜你喜欢
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多