c++ - C++ 中的基准、值、值类型、对象和对象类型
问题描述
首先,让我说我很抱歉在一个 SO 问题上问了几个不同的问题,但它们都是相关的,我不知道如何将它们分开。
在书中,From Mathematics to Generic Programming
Alexander Stepanov 做出了以下定义。
定义 10.1。数据是位序列。
01000001 是基准的示例。
定义 10.2。值是一个数据及其解释。
所以 65 和字符 'A' 是两个不同的值,如果我们要在内存中实现它们,它们可以共享相同的数据。
定义 10.3。值类型是一组共享共同解释的值。
到目前为止,事情都不是关于编程的。这些定义更多的是哲学性质。例如,莱布尼茨本可以使用类似的东西创建所有知识的分类法。
事情在这里与计算机有关。
定义 10.4。对象是内存中包含给定值类型的值的位集合。
定义 10.5。对象类型是在给定其地址时从特定对象存储和检索给定值类型的值的统一方法。
因此,对象是一种在内存中表示事物的方法,而对象类型是一种在编程语言中使用这些表示的方法。编译器跟踪对象和相应对象类型之间的关系,以便我可以在我的程序中表达抽象。根据这些定义,这里有几个问题。
看看下面的代码。
int b = 5;
int& a = b;
std::cout << a + b;
我可以得到这int
是一个对象类型。但;
什么是
a
,b
?它们是变量、标识符还是对象?从定义来看,它们看起来不像对象。他们有对象类型吗?如果是这样,它们应该是一个对象。对象有值吗?的类型是什么
a
,如果这些东西确实有类型?直到今天我认为它的类型是reference to an int
但是引用也是对象类型吗?如果是这样,int
并且int &
看起来完全一样的对象类型。对于右值,我们知道它在内存中有一个相关的对象,因此它们也有相关的值类型、值和数据。但是右值也有对象类型吗?我问这些是因为它们是作为对象的意义上的存储区域。C++ 标准,但它们不可寻址,因此它们似乎不是 Stepanovian 意义上的对象。
你看,我有很多困惑需要澄清。
解决方案
a
并且b
是标识符,尽管当标识符引用变量时人们通常会称它们为变量。(由标识符标识的变量)的类型
a
是int &
,也称为对 的引用int
。C 和 C++ 的诀窍在于,您查看声明,查看您想知道其类型的内容,将其从整个声明中删除,剩下的就是类型。所以&a
(a
指的那个)的类型是int
。引用也是类型。但是“对“的引用
int
”与“int
”的类型不同。您可以将引用视为自动取消引用的指针类型,因此int &b = a; std::cout << b;
或多或少等于int *b = &a; std::cout << *b;
. 在这两种情况下,变量b
实际上都持有一个与变量地址相等的指针值a
。右值不必在内存中有相关对象。例如, in
int b = 5
是5
一个右值。但是,这个5不一定在内存中。在该声明之后内存中有 5 的唯一原因是因为变量b
是用 rvalue 初始化的5
。但是,如果我愿意int b = 1.234
,则该值1.234
将不在内存中,而只有该值1
。但是右值确实有一个类型。例如,1.234
是一个double
。
推荐阅读
- css - 使用 javascript 编辑 iframe 中元素的 css
- c# - C#“while”应该在有人输入正确答案后中断,但它没有
- kubernetes - Kubernetes 调用服务与集群集群中的大使公开-a 来自不同集群集群-b,相同的 prohect 但不同的 vpc
- .net-core - Asp net core SignalR websocket连接时间超过1秒
- apache - 语法错误,使用 fq(过滤查询)时无法从 lucene StandardQueryparser 解析
- android - 发现人工制品的本机依赖项
- next.js - 使用 Netlify 部署 Next.js 网站
- c# - HttpContent.ReadAsStringAsync 导致请求挂起
- cordova - 如何使用适用于 Apache Cordova 的 cordova-android 定位最广泛的 Android 设备?
- java - 如何检查android studio中的日期是否更改?