基准、值、值类型、对象和对象类型(C++)

Datum, Value, Value Type, Object and Object Type in C++

本文关键字:类型 对象 C++ 基准      更新时间:2023-10-16

首先,让我说我很抱歉在一个SO问题上问了几件不同的事情,但它们都是相关的,我不知道如何区分它们。

在《From Mathematics to Generic Programming》一书中,亚历山大·斯捷潘诺夫做出了以下定义。

定义 10.1.基准面是一系列位。

01000001是基准面的一个示例。

定义 10.2.值是基准及其解释。

因此,65 和字符"A"是两个不同的值,如果我们要在内存中实现它们,它们可以共享相同的基准面。

定义 10.3.值类型是一组共享通用解释的值。

到目前为止,事情并不是真正的编程。这些定义更具有哲学性质。例如,莱布尼茨本可以使用类似的东西创建所有知识的分类法。

这里的事情与计算机有关。

定义 10.4.对象是内存中包含给定值类型的值的位的集合。

定义 10.5.对象类型是存储和检索的统一方法 给定特定对象地址时来自特定对象的给定值类型的值。

因此,对象是一种在内存中表示事物的方式,对象类型是在编程语言中使用这些表示的一种方式。编译器跟踪对象和相应对象类型之间的关系,以便我可以在程序中表达抽象。根据这些定义,这里有几个问题。

请看下面的代码。

int b = 5;
int& a = b;
std::cout << a + b;

我可以得到int是一种对象类型。但;

  1. 什么是ab?它们是变量、标识符还是对象?从定义来看,它们似乎不像对象。他们有对象类型吗?如果是这样,它们应该是一个对象。对象有值吗?

  2. 如果这些东西确实有类型,a的类型是什么?直到今天,我认为它的类型是reference to an int但引用也是对象类型吗?如果是这样,intint &似乎是完全相同的对象类型。

  3. 对于右值,我们知道它在内存中有一个相关的对象,因此它们也有相关的值类型、值和数据。但是右值也有对象类型吗?我问这些是因为它们是作为对象 wrt 意义上的存储区域。C++标准,但它们不可寻址,因此它们似乎不是斯捷潘诺维意义上的对象。

你看,我有很多困惑需要澄清。

  1. ab是标识符,尽管当标识符引用变量时,人们通常会称它们为变量。

  2. (由标识符标识的变量(的类型aint &,也称为对int的引用。C 和 C++ 中的诀窍是你查看声明,查看你想知道的类型,从整个声明中删除它,剩下的就是类型。所以&a的类型(a所指的(是int.

    引用也是类型。但是"对int的引用"与"int"的类型不同。您可以将引用视为自动取消引用的指针类型,因此int &b = a; std::cout << b;或多或少等于int *b = &a; std::cout << *b;。在这两种情况下,变量b实际上都持有一个指针值,该指针值等于变量a的地址。

  3. 右值不必在内存中具有相关对象。例如,在int b = 5中,5是一个右值。但是,这个 5 不一定在内存中。该声明后内存中有 5 的唯一原因是因为变量b是用 rvalue5初始化的。但是,如果我这样做int b = 1.2341.234的值将不会在内存中,只有值1。但右值确实有一个类型。例如,1.234是一个double