C ++中的变量究竟是什么?

时间:2010-05-27 11:48:10

标签: c++ variables object

标准说

  

变量由对象声明引入。变量的名称表示对象。

但这个定义究竟意味着什么?

变量是否为对象命名,即变量只是其他匿名对象的命名机制?或者是名称本身的变量?

或者变量是一个命名对象,因为每个变量也是一个对象?

或者变量只是一个“代理”,其名称将所有操作“委托”给真实对象?

为了进一步混淆,许多C ++书籍似乎将变量和对象视为同义词。

您对此有何看法?


关于实体,引用C ++ 0x草案:

  

实体是价值,对象,参考,功能[...]

     

表示实体的每个名称都由声明引入。

     

变量由对象声明引入

从这些陈述中我得出结论,变量是名称,因此不能是对象。这真让我感到困惑:)

10 个答案:

答案 0 :(得分:16)

变量是命名对象。以下创建非变量的对象

new int // create one int object
std::string() // create one string object

以下创建一个名为“foo”的数组变量和5个类型为“int”的未命名(子)对象

int foo[5];

以下不是C ++ 03中的变量,而是C ++ 0x中的has become a variable(声明的引用是C ++ 0x中的变量,有关详细信息,请参阅链接)

extern int &r;

变量是否为对象命名,即变量只是匿名对象的命名机制?

变量是对象(或分别是引用)。 C ++中的实体列表(C ++ 03中的3/3)包含多个此类is-a关系。例如,子对象是对象,数组元素是对象,类成员是对象或函数或类型或模板或枚举器。

C ++ 0x的实体列表对我来说看起来更清晰,并且它不包含“变量”,“函数的实例”(这种实体甚至对我来说从未显而易见), “子对象”和“数组元素”了。相反,它添加了“模板专业化”,它可以是函数,类或模板(部分特化)。

1.8处的C ++对象模型说

  

对象可以有名称(第3条)。

因此,如果您愿意,可以将语句表述为“对象的名称表示对象。”。

答案 1 :(得分:2)

变量是您赋予对象的名称,所以是的,对象基本上是匿名的。

答案 2 :(得分:1)

  

您对此有何看法?

变量是堆栈或代码段中的内存块,或者是寄存器中的值(如果变量的大小足够小,尽管通常它在存储器中仍然是值,而寄存器保存临时结果),名称为程序员提供便利。编译后变量名称不存在(我们这里不讨论宏技巧)。对变量的任何访问都被解析为内存访问,因此技术上可变的是相应数据块的地址,并且该地址不存储在任何地方。考虑汇编语言中变量的声明 - 变量“kinda”存在,但它仍然只是数据块的偏移量。

答案 3 :(得分:1)

变量只是一个具有类型和名称的实体

答案 4 :(得分:1)

据我了解

什么是变量

变量是一个标识符,它绑定到存储在系统内存中的值(命令语言)或可以求值的表达式(功能语言)。

我们为什么需要变量

  • 为存储块提供名称,以在计算机程序的生命周期内临时存储数据。
  • 还用于编程,以将信息从程序的一部分转移到另一部分(例如,参数,全局变量)。

答案 5 :(得分:1)

在数学中,变量是当我们不知道,不关心或不想承诺要处理的特定值时用于代表某种类型的值的符号完全一样。它是用来表示某种变量值的名称...

同样,在计算机编程中,变量是用于表示某种值的符号。鉴于计算机科学的历史,可以很肯定地说该术语在编程中的使用直接源自其在数学中的使用。变量的全部意义在于它们表示的值是可变的,即可以变化。使用变量,我们可以表达一些涉及某种值的计算,而不必知道这些值将是什么。从某种意义上说,变量是我们如何将要执行的计算的描述与要在其上进行计算的具体数据区分开的方式。

就C ++而言,您似乎已经迷惑了C ++标准与[basic]/6一起使用的定义:

  

变量 是通过声明非静态数据成员或对象以外的引用来引入的。变量的名称(如果有的话)表示引用或对象。

由于引用不是对象(如果引用不是对象,则在上面引用的句子中没有区别是没有意义的),因此说变量“是与标识符配对的对象”在技术上不是100%正确”。引入变量的声明也可以创建对象[intro.object]/1。对象类型的变量表示对象。但是,尽管引用类型的变量也可以有效地完成[expr]/5,但变量本身实际上表示的是引用,而不是对象。并且可以存在对函数的引用,这些函数既不是对象也不是对象,但是仍然是变量。而且由于引用的变量不是对象且没有地址,因此不一定存在直接与该变量本身相对应的任何存储位置……

但是即使考虑到所有这些技术细节,如果您只考虑到最终将其归结为一种的行为,则变量只是代表某种价值的符号名称……

答案 6 :(得分:0)

我认为这个定义很清楚。

变量由声明引入并表示对象。谁介绍变量?你这样做,因此是你使用它。

变量实际上只是开发人员的一种便利。它是大多数编程语言的基本方面,而不仅仅是C ++。变量mearly为占用存储的可用实体提供符号名称,以便可以在源代码的未来点引用和使用它。

例如,如果您在方法中声明变量:

int x = 5;

这将被编译器减少到堆栈指针的某个偏移量,比如SP + 0x003。

稍后您可以说:

x = 52;

在这种情况下,堆栈内存SP + 0x003的区域将包含描述数字52的字节。

您将变量声明为某种类型,以便编译器可以计算出数据在内存中占用的空间大小。 如果没有变量,您必须自己管理所有信息的排列,并且您可能会在汇编或更低版本中进行编码。

答案 7 :(得分:0)

变量实际上是给予内存中对象的名称,因此在编译之前,对象在这方面是匿名类型,当编译发生时,变量在语法和解析阶段保持跟踪然后当链接器启动时,该变量将为其分配一个内存地址,尽管在运行时,该内存地址将在某处正确设置,以考虑动态链接或静态链接。因此,变量可以很容易地被引用,也就是变量被赋给的内存地址。

实际上,简而言之,变量是帮助程序员根据机器代码计算出该变量被引用的连接点。

答案 8 :(得分:0)

变量是对象的名称。您可以通过此命名实体访问该对象。

答案 9 :(得分:0)

这是C ++ 17标准的定义:

  

变量 通过引用其他变量的声明引入   而不是非静态数据成员或对象。变量的名称,如果   任何,表示引用或对象。

坦率地说,我对此的看法不是真正的定义。它告诉我们什么引入了变量,但没有定义什么变量

考虑一下,例如:

int foo = 42;

这是对象的声明,因此它“引入”了一个变量。但是变量是什么?名为foo的对象是否为变量?我本来会这样想的,但是定义实际上并没有这么说。显然,“变量”具有名称(在本例中为“ foo”),并且该名称表示对象。由于它具有名称,因此名称本身可能不是变量。如果说这是目的,那么很容易说变量是对象,而不是变量的名称表示对象。

什么是C ++中的“变量”?我真的不知道,而且我不相信有可能根据标准中的措词回答问题。 (我希望在以后的版本中对此进行更正。)

(C标准通过不定义“变量”来处理此问题,并且除形容词或非正式形式外,大部分不使用它。)

相关问题