基准、值、值类型、对象和对象类型(C++)
Datum, Value, Value Type, Object and Object Type in C++
首先,让我说我很抱歉在一个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
是一种对象类型。但;
什么是
a
,b
?它们是变量、标识符还是对象?从定义来看,它们似乎不像对象。他们有对象类型吗?如果是这样,它们应该是一个对象。对象有值吗?如果这些东西确实有类型,
a
的类型是什么?直到今天,我认为它的类型是reference to an int
但引用也是对象类型吗?如果是这样,int
和int &
似乎是完全相同的对象类型。对于右值,我们知道它在内存中有一个相关的对象,因此它们也有相关的值类型、值和数据。但是右值也有对象类型吗?我问这些是因为它们是作为对象 wrt 意义上的存储区域。C++标准,但它们不可寻址,因此它们似乎不是斯捷潘诺维意义上的对象。
你看,我有很多困惑需要澄清。
-
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
的地址。 -
右值不必在内存中具有相关对象。例如,在
int b = 5
中,5
是一个右值。但是,这个 5 不一定在内存中。该声明后内存中有 5 的唯一原因是因为变量b
是用 rvalue5
初始化的。但是,如果我这样做int b = 1.234
,1.234
的值将不会在内存中,只有值1
。但右值确实有一个类型。例如,1.234
是一个double
。
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- C++ 多态模板类,模板类型对象的实例化
- 如何分配适合容纳 T 类型对象的缓冲区(可能过度对齐、可能有运算符 new 等)
- 如何构造一个 std::variant 类型对象,其自身 Templated 和构造函数转发参数
- C++:初始化指向具有不同类型对象的指针数组
- 在类 C++ 中构造的模板类型对象
- 如何将颁发者名称设置为x509_req类型对象
- 将任何数据类型/对象作为参数传递以确定其大小
- 将引用类型对象的数组从C#封送到C++
- <T> 从类型对象创建类型<T1>对象的构造函数
- C++是否有现有的方法来检查对象是否是派生类型对象
- C 模板:创建与现有对象相同的类型对象
- 链接列表中的虚函数 - 多种返回类型(对象)
- 没有适当操作员()的类型对象的呼叫
- 制作垫子类型对象的数组.输出窗口显示同一帧
- 抽象类型对象的分配
- 在std::list中就地创建自定义类型对象
- 接受泛型列表类型对象的参数
- C++-将模板类型对象强制转换为特定的数据类型
- 试图在C++中打印存储在类型对象数组中的信息