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

Jos*_*eld 10 c++ variables standards definition c++11

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

变量是由比非静态数据成员或对象的其他的基准的声明引入.变量的名称表示引用或对象.

因此,非静态数据成员引用不是变量.为什么这种区分是必要的?这里的理由是什么?

Dan*_*lme 6

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

int scientist = 7;
Run Code Online (Sandbox Code Playgroud)

在这个声明(和定义,在这种情况下)之后,我可以scientist用来读取和设置它的值,取其地址等.这是另一种声明: -

class Cloud {
    public:
    static int cumulonimbus = -1;
};
Run Code Online (Sandbox Code Playgroud)

这个有点复杂,因为我必须将新变量称为Cloud::cumulonimbus,但我仍然可以读取并设置其值,因此它显然仍然是一个变量.这是一种不同的声明: -

class Chamber {
    public:
    int pot;
};
Run Code Online (Sandbox Code Playgroud)

但是在这个声明之后,没有一个叫做的变量pot,或者Chamber::pot.实际上根本没有新的变量.我已经声明了一个新类,当我稍后声明该类的一个实例时,它将有一个被调用的成员pot,但是现在,没有任何东西被称为.

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

class Chamber {
    public:
    int pot;
};

void f(bool b) {
    if (b)
        Chamber::pot = 2;
}
Run Code Online (Sandbox Code Playgroud)

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

快速脚注:这里标准的语言是专门讨论引用,但为了使示例更容易,我一直在使用非引用.我希望你能看到这并没有改变它的原理.

  • "pot"的声明不会引入变量,原因很简单,因为它没有引入一个对象.它是*member-declaration*,而不是*声明*,因此它声明了类的成员,而不是引入新对象.这就是问题的全部要点:引用的特殊语言是镜像对象所具有的属性. (2认同)