C++含定长数组的类:默认拷贝与赋值运算符为何正确?
关于C++中Message类拷贝与赋值的问题解析
先看你给出的类定义:
class Message { char msg[64]; };
一、默认拷贝构造函数与operator=为何正确?
默认生成的拷贝构造和赋值运算符,对于数组类型的成员,会直接逐字节复制整个数组的全部内容——把源对象msg数组里的64个char字节,完整复制到目标对象的msg数组中。这种行为完全符合我们对这个类的拷贝需求,所以是正确的。
二、手动实现的赋值运算符为什么错误?
你写的这段代码:
Message & operator=(const Message &o) { if (this != &o) this->msg = o.msg; } return *this; }
核心问题在于:C++里数组名是不可修改的左值,不能直接用=赋值。this->msg = o.msg;这句试图把一个数组的地址赋值给另一个数组的名字,这是语法不允许的操作——数组本身没有赋值运算符,要复制数组内容,必须用逐个元素赋值、memcpy或者strcpy(如果是字符串的话)这类方式完成。所以这段代码根本无法通过编译,自然是错误的。
三、关于默认拷贝语义的误解澄清
默认拷贝操作的语义并不是对所有成员都“逐字段调用赋值运算符”:
- 对于类类型的成员,默认操作会调用该类的拷贝构造或赋值运算符;
- 对于数组这种内置复合类型,默认操作是直接逐字节复制整个数组的内存内容,而不是调用什么数组的赋值运算符(因为数组根本没有这个东西)。你之前的误解就出在这里。
内容的提问来源于stack exchange,提问作者Yann TM
相关产品推荐
相关产品推荐

