c++ 默认赋值运算符

Posted

技术标签:

【中文标题】c++ 默认赋值运算符【英文标题】:c++ default assignment operator 【发布时间】:2013-08-09 18:31:58 【问题描述】:
int a[10];
int b[10];
a = b;

//

struct test 
    int a[10];
;

test a,b;
a = b;

第一个代码无法编译,因为我们不能分配数组,但第二个代码可以。类的默认赋值运算符不是简单地为每个数据成员调用赋值吗?为什么第二段代码会编译?

【问题讨论】:

默认的类赋值运算符将复制数组的所有元素。这就是 std::array 在没有用户提供的情况下的工作方式。 因为作为成员的数组有一个特殊的例外。 为什么涉及std::array?我错过了什么吗? 【参考方案1】:

来自 C++11 草案,第 12.8 节:

非联合类 X 的隐式定义的复制/移动赋值运算符执行其子对象的成员复制/移动赋值。首先分配 X 的直接基类,按照它们在基说明符列表中的声明顺序,然后按照它们在类定义中声明的顺序分配 X 的直接非静态数据成员.令 x 为函数的参数,或者对于移动运算符,为引用参数的 xvalue。每个子对象都以适合其类型的方式分配:

——如果子对象是类类型,就好像通过调用 operator= 将子对象作为对象表达式和 x 的相应子对象作为单个函数参数一样(好像通过显式限定;也就是说,忽略任何更多派生类中可能的虚拟覆盖函数);

——如果子对象是一个数组,则以适合元素类型的方式分配每个元素;

——如果子对象是标量类型,则使用内置赋值运算符。

这里重要的部分是:if the subobject is an array, each element is assigned, in the manner appropriate to the element type;

【讨论】:

以上是关于c++ 默认赋值运算符的主要内容,如果未能解决你的问题,请参考以下文章

C++ 拷贝构造函数和赋值运算符

C++类的默认函数

❥关于C++之类的复制构造函数&赋值运算符

C++类与对象(详解构造函数,析构函数,拷贝构造函数,赋值重载函数)

C++初阶---类和对象(类的默认成员函数和其他)

C/C++编程笔记:用C++编写赋值运算符,一般什么情况下用?