c++ - 为什么非静态数据成员引用不是变量?

标签 c++ variables c++11 standards definition

C++11中变量的定义如下(§3/6):

A variable is introduced by the declaration of a reference other than a non-static data member or of an object. The variable’s name denotes the reference or object.

所以非静态数据成员引用不是变量。为什么这种区分是必要的?这里的基本原理是什么?

最佳答案

这是我可以在 C++ 中声明变量的一种方法:

int scientist = 7;

在这个声明(和定义,在本例中)之后,我可以使用 scientist 来读取和设置它的值,获取它的地址等。这是另一种声明:-

class Cloud {
    public:
    static int cumulonimbus = -1;
};

这个有点复杂,因为我必须将新变量引用为 Cloud::cumulonimbus,但我仍然可以读取和设置它的值,所以它显然仍然是一个变量。这是一种不同类型的声明:-

class Chamber {
    public:
    int pot;
};

但是在这个声明之后,没有一个名为potChamber::pot 的变量。事实上根本没有新变量。我已经声明了一个新类,当我稍后声明该类的一个实例时,它将有一个名为 pot 的成员,但现在,没有任何名称。

类的非静态数据成员本身不会创建新变量,它只是帮助您定义类的属性。如果它确实创建了一个新变量,您就可以编写如下代码:

class Chamber {
    public:
    int pot;
};

void f(bool b) {
    if (b)
        Chamber::pot = 2;
}

那甚至意味着什么?它会找到 Chamber 的每个实例并将它们的所有 pot 设置为 2 吗?这是胡说八道。

快速注脚:这里的标准语言专门讨论引用,但为了使示例更简单,我一直使用非引用。我希望你能看到这不会改变它的原则。

关于c++ - 为什么非静态数据成员引用不是变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12987259/

相关文章:

c++ - Windows 中的套接字编程发送数据会卡住一段时间并延迟一段时间?

c++ - 数组的名称是右值吗?

c++ - 使用 cmake、clang 和 llvm 为 visual studio 构建工具链

python - for in 循环内的变量赋值

php - 根据变量中的值显示不同的图像

c++ - 调用重载的 to_string 不明确

c++ - 在 C++ 命令行程序中显示可由用户编辑的变量的默认文本?

c++ - 为什么 mingw 4.4 说 <random> 需要 c++0x?

c++ - 如何在从 boost 库拆分时添加两个值

c++ - 如何 SFINAE 启用返回 `auto` 的成员函数