说变量是数据类型的实例是否正确?


9

(可以在程序执行过程中更改其值)

还是“事物的实例”与类和对象严格相关?如果是这样,当涉及到C ++时,您将如何定义“变量”的概念?


C#和Java在两个有趣的方面不同于C ++。首先,他们尝试将原始类型与对象(和结构)类型统一(以便您可以谈论int的实例),而C ++则没有。其次,在C#和Java中,对象类型的变量隐式引用堆中的(类的)实例,并且我们不谈论对象的指针,而在C ++中,例如@coredump的答案,对象类型的局部变量是到堆栈上实例的绑定,我们明确区分对象和对象指针。
Erik Eidt'Mar

Answers:


8

据我所知,调用该类型的原始类型实例的值是正确的 (例如,参见Visual Studio手册中的“ C ++ Type System”,但我仍在寻找其他来源),尽管我相信这个术语是主要用于讨论对象时。如果对象是从类C或其子类之一中定义的构造函数生成的,则它是类C的实例。

C ++中的变量不是运行时概念。它作为变量名和抽象(如果不是const时是可变的)位置之间的词汇绑定,存在于编译器内部。一旦程序被编译,变量就不存在了。而是在寄存器,内存等中读取和写入数据。


2
通常不说原始类型的值是该类型的实例;它是保留给对象和类的。 ”根本不是真的。标准中没有任何地方不将原始类型的值视为对象。变量的定义也不会以任何方式更改,这取决于它是用户定义的类还是原始类型。
Nicol Bolas's

@NicolBolas我从没听说过有人在C ++上下文中将整数称为某事的实例,而且我很确定地说,它们不是任何事的实例是正确的,即使标准没有明确提及。如果不是,它们是什么实例?我也看不到这个答案在哪里声称变量的定义在原始类型和对象之间发生变化。似乎(正确地是afaik)声称“实例”与变量的定义无关。
Ixrec

2
@Ixrec:“ 如果不是,它们是什么实例? ”类型int。在讨论变量声明的作用时,C ++标准没有在原始类型和非原始类型之间进行区分。因此,无论类型是什么,都T t;声明一个type的对象。TT
Nicol Bolas's

1
@Ixrec:请注意,文字是另一种事情。文字是一种prvalue。但是您不能创建文字变量,所以这是一个不同的讨论。
Nicol Bolas's

5

还是“事物的实例”与类和对象严格相关?如果是这样,当涉及到C ++时,您将如何定义“变量”的概念?

为C ++尽可能简洁

  • 变量是一个名称为(在代码中)在存储器位置在运行时被确定。
  • 一个实例是一个对象,其驻留在内存中在运行时。

只是要清楚:

  • 并非所有的内存区域都包含对象。例如,某些内存区域可能包含“垃圾”值。
  • 并非所有的存储对象都在代码中被赋予了名称。对象可能驻留在未命名的内存区域中,例如数组中的位置,或指针引用的堆上的某个位置。
  • 当内存区域包含垃圾时,通常是因为该位置没有初始化任何对象,或者是因为某些先前存在的对象已被破坏。

1
POD是C ++中的对象。并非所有的内存区域都是对象,但是POD不仅仅是内存的区域。
Nicol Bolas's

1
第二点是NicolBolas:POD是对象。但是,当谈到新malloc()的但未初始化的缓冲区时,您有一点要注意:这是一个尚未成为对象的存储区。同样,已被明确销毁的对象:这是一个不再是对象的内存区域。
cmaster-恢复莫妮卡

@NicolBolas公平的评论,我已经稍微改变了措辞
Ben Cottrell

1

那么,“正确”是什么意思?

如果我们想对此进行严格限制,则需要区分以下两者:

  • 语法方面:表现 (静态)类型
  • 语义方面:对象实例

因此,变量(即表达式)将具有类型。它的值(它所引用的对象)将是某个类的实例。并且请注意,变量的类型和对象的类通常不是同一东西-变量的静态类型为对象的运行时类设置了上限,因此这些类必须是与该类型相对应的类的类型。

您想一直重复一遍大嘴巴吗?哎呀 我们要说的严格程度与宽松程度取决于上下文。通常,说“变量是这种类型的实例”确实没有问题。实际发生的是,我们正在使用转义的变量和类型来引用对象及其运行时类的超类。


1

除非您想一生都从事纯粹主义和幽灵主义...是的。

每当您保留唯一标识的内容时,就可以伪造您正在实例化的其他唯一标识的内容。

  • 项目实例化为产品
  • 源实例化为可执行文件
  • 模板实例化为类型。
  • 类型实例化为变量。

这些实例中的某些实例可能具有更准确的名称,但是总的来说,这是可行的。


0

许多人为类的实例保留“实例”。如果在C ++中执行此操作,则变量可能是类的实例,对实例的引用,对实例的指针或原始类型(在这种情况下,您可能将结构视为类,它们几乎是完全一样)。在Java或Objective-C中,变量永远不会是实例,而可能是对实例的引用。

忘记了:在很短的时间内,C ++指针可以是指向原始内存的指针,例如在构造函数开始执行之前的“ this”。您可能目前还没有将* this称为实例。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.