Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;:memberwise作业是如何工作的?_C++_Variable Assignment - Fatal编程技术网

C++ c++;:memberwise作业是如何工作的?

C++ c++;:memberwise作业是如何工作的?,c++,variable-assignment,C++,Variable Assignment,可能重复: 如果我不重写类的操作符=,它将使用默认的memberwise赋值 但这意味着什么 struct A { int array[100]; }; A a; A b=a; 没有错误。b如何处理a的数组?通常array\u b=array\u a无效 另一个例子: struct A { vector<int> vec; }; A a; A b=a; 结构A{ 向量向量机; }; A A; A b=A; b如何应对a的vec?通过赋值(vec\u b=vec

可能重复:

如果我不重写类的
操作符=
,它将使用默认的memberwise赋值

但这意味着什么

struct A {
    int array[100];
};
A a;
A b=a;
没有错误。
b
如何处理
a
数组
?通常
array\u b=array\u a
无效

另一个例子:

struct A {
    vector<int> vec;
};
A a;
A b=a;
结构A{ 向量向量机; }; A A; A b=A;
b
如何应对
a
vec
?通过赋值(
vec\u b=vec\u a
),构造函数(
vec\u b=vector(vec\u a)
)或其他神秘方式

A b=a;
不是赋值,称为

调用隐式生成的复制构造函数,从现有对象
a
创建新对象
b
隐式生成的复制构造函数复制
数组
成员

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

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

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

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

如果成员具有复制构造函数,则会调用它们。如果不是,默认的复制构造函数将执行与memcpy等效的操作。看


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

通常,是。什么是数组的浅拷贝?@KonradRudolph:在这种情况下,一个
memcpy
。浅拷贝将应用于指针,这就是三字规则的原因。这也适用于OP的“通常情况下,数组b=数组a无效”。在这种情况下,不能使用这样的赋值,但可以通过这种方式构造新数组(只要rhs是数组文字)。@ChrisA。如果数组元素是指针,则为。@Als您的意思是这里是浅拷贝,修改对象a的数组变量将修改对象b的数组变量的内容吗?可能是重复的