我们如何返回对类成员变量的引用

时间:2018-12-02 07:12:23

标签: c++ class scope member-variables return-by-reference

我想了解为什么可以在C ++中返回对类成员变量的引用,例如以下示例:

class Foo
{
int x;
public:
int& get_pvar()
{
return x;
}};

显然,我们可以在main()中访问变量x,创建对它的引用,然后更改其内容:

Foo obj;
int& ref = obj.get_pvar();
ref = 7;

但这怎么可能? x没有全局范围,也不是类的静态成员。在类中 中定义。因此,它应该具有本地范围。那么,为什么返回一个引用甚至在main()中创建一个引用也不是一个错误呢?

3 个答案:

答案 0 :(得分:2)

您正在混淆范围和生存期。这是两个相关的概念,但最终是不同的概念。

名称 x的范围是类范围。您只能为该类的成员函数(和此处无关的其他细节)中的成员使用不合格的名称x

名为x的成员对象的 lifetime 与封闭的类对象相同。在这种情况下,obj.x的生存期与obj相同。由于您在对象的生存期内返回了对对象的引用,因此所有内容都会检出。


造成混淆的原因可能是由于了解到具有自动存储持续时间的对象,如下所示:

{
    int x;
}

将它们的生存期绑定到其词法范围(它们只能在这些花括号内命名,即它们的范围)。但是,尽管对于那些对象而言确实如此,但一般而言它并不适用。类对象可以独立于其名称范围使用(如您所见)。有些对象可以有生命周期,但是没有范围和名称。考虑:

auto* p = new Foo();

new表达式创建一个对象,但没有名称!因此,没有什么可说的。这里的p是指针的名称,而不是新创建的对象的名称。

答案 1 :(得分:1)

“范围”和“访问控制”是适用于名称的内容,而不是变量。说xFoo中是私有的,这意味着如果我们在某些不相关的上下文中编写x,将找不到该名称。

但是,如果您不需要查找名称,则仍可以在其他上下文中访问该变量。

答案 2 :(得分:0)

这就是引用或指针的工作方式。如果您决定导出私有字段的地址,则可以从外部进行更改。

这是一种不好的做法,但该语言没有任何机制可以阻止开发人员执行该操作。