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

C数组作为用户自定义类成员时的赋值机制解析

C数组作为类成员可赋值的机制解析

核心原理

C语言及C++中,数组本身是不可直接赋值的左值——你没法写int a[5]; int b[5]; a = b;,因为数组名会隐式退化为指针,这种写法本质是试图给指针赋值,但数组是固定的内存块,不能被重新指向其他内存区域。

但当数组作为类的非静态成员时,类的赋值操作(无论是编译器生成的默认赋值运算符,还是用户自定义的)执行的是逐成员复制:赋值两个类对象时,编译器会把源对象中数组的每个元素,逐个拷贝到目标对象的数组内存空间里,而非尝试直接对数组本身进行赋值操作。

举个可正常运行的示例:

struct MyClass {
    int arr[5];
};

int main() {
    MyClass obj1 = {{1,2,3,4,5}};
    MyClass obj2;
    obj2 = obj1; // 合法,编译器自动逐元素复制arr数组
    return 0;
}

C++标准的相关规定

C++标准明确:如果类没有显式声明赋值运算符,编译器会自动生成默认赋值运算符。对于类的非静态数据成员,默认赋值运算符会按成员的声明顺序依次执行赋值操作:

  • 对于非数组类型成员,直接执行赋值;
  • 对于数组类型成员,会遍历数组的每个元素,将源对象数组的元素逐个赋值给目标对象数组的对应元素。

这一规则在C++11及后续版本的标准中都有明确界定,确保数组成员能通过类对象赋值完成元素的批量复制。

是否源自C语言

这个特性的底层逻辑(逐成员复制数组元素)在C语言的结构体赋值中已有体现:C语言允许直接赋值包含数组的结构体,本质也是对结构体成员(包括数组)进行逐元素复制。但需要明确:

  1. C语言没有“类”的概念,只有结构体;
  2. C的类默认赋值运算符对数组成员的处理,是继承了C语言结构体逐成员复制的逻辑,但C标准对类的赋值机制做了更细致、明确的规范,同时结合了类的封装、继承等面向对象特性,并非直接从C语言的数组特性延伸而来。

内容的提问来源于stack exchange,提问作者MikO

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:44:51