结构体或类的实例可以被视为变量吗?

Cra*_*kie 2 c++ variables

我读了:

\n
    \n
  • 变量是内存位置的名称。
  • \n
  • 在 C++ 中,变量实际上只是保留给程序\xe2\x80\x99 使用的一点内存。\n( https://en.cppreference.com/book/intro/variables )
  • \n
  • 变量名是标识符。标识符是 C++ 中用于各种事物的标签,包括函数、类、命名空间以及变量。
  • \n
\n

(意味着变量名只是标识符的一种情况)

\n

在标准 C++ 术语中,我们可以将结构体或类的实例名称视为变量吗?或者我们应该只称其为“标识符”吗?

\n

我知道这绝对是一个菜鸟问题,但即使我尝试从多个来源读取变量的定义,我自己也确实无法回答这个问题。请帮忙。

\n

Pet*_*ica 9

Tl;dr:变量通常是一个命名对象,或者是对对象的引用。有些变量没有名称,有些变量没有关联的对象,但这些都是例外。

\n
\n

现行标准6.1中规定:

\n
\n

变量是通过引用[...]或对象的声明引入的。

\n
\n

该标准很小心地没有说“创建”,因为运行时的创建点将与这个“介绍”不同,特别是对于引用而言。静态代码中的名称在声明之后可用;该对象在运行时的某个时间可用。在引用的情况下,对象实际上可能已经消失,但变量可能仍在范围内(例如,当您从函数返回对局部变量的引用时)。

\n

我们看:

\n
    \n
  • 变量可以命名一个对象:
    int i;
  • \n
  • 变量可以是引用:
    int i; int &ri{i};
  • \n
  • 由于存在悬空引用,因此存在没有对象的变量:
    \nint &f(){int i; return i;} int &r = f();
  • \n
\n

它继续

\n
\n

变量\xe2\x80\x99的名称(如果有)表示引用或对象。

\n
\n
    \n
  • 好的:我想这构成了一个没有名称的变量:
    \nint &f(int /*unused*/) {}
  • \n
\n

但并非所有未命名对象都是变量:
\nint *p = new int{};

\n

p当然,是一个变量;它int指向的不是一个对象,即使它是一个对象。

\n

当然,如果您是矛盾修饰法的朋友,那么还有常量变量。还有一些名称不是变量,例如标签。

\n
\n

你实际上在问两个问题。标题是“结构体或类的实例可以被视为变量吗?” 答案是实例本身不是变量;实例本身不是变量。它只是一个对象。new您可以使用上面示例中的创建一个int。这将是一个实例,但不是一个变量(如果将地址分配给指针,则该指针将是一个包含地址的变量)。

\n

在问题正文中,您会问一些不同的问题:“我们可以将结构体或类的实例的名称视为变量吗?” 我想说这是正确的:变量(通常)是命名对象。顺便说一句,它是结构体还是内置类型在这里并不重要。

\n