价值和对象有什么区别?

4
我正在阅读关于值类型以及对象的文章,似乎这些词有不同的含义,所以我认为它们确实有区别。然后我试图做一些研究,但没有成功。我知道一个值是一个不能进一步评估的表达式,但一个对象只是一个值的“容器”吗?此外,根据我的术语理解,如果一个值是一个表达式,那么说一个对象持有一个表达式是否奇怪?
我不会开始猜测太多,因为那可能会使一切变得复杂,并可能将焦点从值和对象之间的差异转移开来。
编辑:对于那些将其标记为“过于宽泛”的人,以下问题是否同样宽泛,甚至更宽泛rvalues、lvalues、xvalues、glvalues和prvalues是什么?此外,SO上还有很多其他“差异”问题,其中许多与我链接的问题一样宽泛。那么,为什么这个特定的问题无效?

4
杯子和水之间的区别是相同的。 - StoryTeller - Unslander Monica
1
@user0042 像 1.8 C++对象模型 [intro.object] 这样的内容吗? - juanchopanza
3
表达式不是值,但你可以说它们具有或表示值。表达式“挪威现任国王”并不是现任国王,尽管它的意思是这样的。 - molbdnilo
1
投票重新开放。 “我不知道”不是关闭问题的理由;这是一个常见的困惑领域(正如迄今为止的评论所证明的那样)。 - M.M
1
@sdsadasdasd:“对于那些将此标记为“过于宽泛”的人,以下问题是否同样宽泛,甚至更宽泛:什么是rvalue、lvalue、xvalue、glvalue和prvalue?”不是的。这些都由C++标准明确定义了。对象是明确定义的,但“值类型”不是。这是一个概念上的习语,而不是标准定义的构造。 - Nicol Bolas
显示剩余11条评论
2个回答

5

对象更为抽象。

就像评论中提到的那样,值和对象之间的差异/关系类似于水和杯子之间的关系。

你需要一个容器,在这种情况下是一个杯子,来容纳水,否则水会漏出来。同样,你需要一个对象来存储值,以便它们不会很快丢失或被覆盖。

一个对象总是有其专用的存储区域(在内存中),而一个值的寿命可能只有一个单指令(movl %eax, $1)。


我相信我需要更详细的解释才能真正理解差异。如果对象被定义为存储区域,值被定义为无法进一步评估的表达式(在Wikipedia上),那么您是否意味着存储区域包含无法进一步评估的表达式?在发现值的定义之后,事情变得很混乱... - user8525706

3
这个术语在计算机科学的不同领域有稍微不同的含义(可以从其维基页面上的讨论中看出)。在C++和问题中提到的“值类型”这个背景下,我将回答引入这个话题。权威参考资料包括Alexander Stepanov的《Programming Elements》和John Lakos关于值语义类型的讲座。
一个值是一个集合的成员,独立于其表示而存在。
作为“十五”,“15”,“0xf”,“十五”或“ⅩⅤ”表示的整数集合成员都是相同的、通用的值。我可以在两张纸上写下它们,并给它们各加一,即使使用不同的符号表示,两张纸也会有相同的精确值16的表现形式(这就是“值语义”的意思)。
一个对象是计算机内存区域,由位(二进制数字)组成,并具有类型。类型之一的作用是确定这些位的状态与我们所处理的对象值之间的映射。
一个由00001111位组成的int8_t类型对象,在现有计算机上被认为代表整数值“十五”。

1
谢谢!但是还不是很清楚。所以这篇维基百科文章将_value_定义为一个无法进一步评估的_expression_;他们声称_values是_expressions_。这让一切都变得混乱了。从你和其他人说的话来看,你们似乎都没有将values定义为expressions,那么为什么他们会这样做,或者values真的是expressions吗?此外,根据我对表达式的术语理解,存储在内存中的表达式似乎很奇怪。你能帮忙吗? - user8525706
@sdsadasdasd 注意维基页面上写着“存疑-讨论”。如果您想了解更多,请点击“讨论”。 - Cubbi
但它仍然声称值是“表达式”? - user8525706
@sdsadasdasd在回答中添加了两个参考文献,我认为它们在这个背景下是权威的(而且这些想法正是我试图总结的)。 - Cubbi
1
但是,你是说维基百科文章关于值的陈述是错误的吗?所以你是在说值不是表达式吗? - user8525706
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接