12

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

变量是由非静态数据成员或对象以外的引用的声明引入的。变量的名称表示引用或对象。

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

4

1 回答 1

9

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

int scientist = 7;

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

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

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

class Chamber {
    public:
    int pot;
};

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

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

class Chamber {
    public:
    int pot;
};

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

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

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

于 2012-10-20T10:23:07.440 回答