C++中的对象是存储位置(storage location)还是值(value)?
C++中对象的本质到底是存储位置还是值?
这个疑问本质是把对象的两个关联属性对立了,实际上C++标准定义的对象同时具备这两种属性,二者完全不冲突。
我们结合你提到的两处标准表述逐一解释:
从「占用存储」看对象的容器属性
[intro.object]/1 的表述如下:
对象在其构造阶段、整个生命周期内以及销毁阶段占用一块存储区域。
这里明确了对象的存在基础是一块绑定了特定类型属性的内存空间:这块空间的大小、对齐要求都由对象的类型决定,是存储值的「容器」,也就是你说的存储位置属性的来源。
从「持有有效值」看对象的值属性
[basic.types.general]/2 的表述如下:
对于任意可平凡复制类型T的对象(潜在重叠子对象除外),无论该对象是否持有T类型的有效值,构成该对象的底层字节都可以被复制到char、unsigned char或std::byte数组中。
这里对应的就是对象的值属性:当这块绑定的内存空间里的字节内容符合对应类型的语义约定时,对象就处于有效状态,可以执行该类型允许的所有操作,此时它的对外表现就和「值」的概念完全对应。
用简单示例理解二者的关系
我们以最常见的int类型变量为例:
int a = 1;
- 这里的对象
a首先对应栈上一块满足int类型大小、对齐要求的存储区域,这是它的存储位置属性,只要对象没有被销毁,这个存储位置就不会变; - 赋值为1之后,这块存储里的字节内容对应int类型的1,也就是对象持有了有效值1,这是它的值属性;
- 如果后续执行
a = 2,改变的是这块存储里的内容(也就是对象持有的值),但对象本身还是原来那个对应固定存储位置的实体,没有发生替换。
最后澄清两个常见误区
- 裸存储区域本身不是对象:比如你用
malloc申请的一块内存,只是无类型的原始存储,只有在这块内存上完成了指定类型的构造操作之后,它才成为对应类型的对象; - 对象和它持有的值不是绑定死的:同一个对象在生命周期内可以多次赋值,持有多个不同的同类型值,存储位置不变的情况下,值可以任意替换。
内容的提问来源于stack exchange,提问作者Géry Ogam
相关产品推荐
相关产品推荐

