You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:52:38