为什么在类的私有部分声明变量为引用

why we declare variable as a reference in private section of a class

本文关键字:声明 变量 引用 为什么      更新时间:2023-10-16

我知道将变量声明为函数中的引用或指针是多么有用,但我只是想知道为什么我们在类的私有部分中将其声明为引用

例子
class DoSomething
{
  private : int& t_; // why not just 'int t;'
};

如果我们声明变量而不引用,并将类的对象定义为指针或引用会怎么样?这不是很好的实践吗?

如果将变量声明为int,则其值将与初始化它的变量"分离"。如果您将其保留为引用,则该变量将"跟踪"与其初始化的变量:

class demoRef {
    int &r;
public:
    demoRef(int& x) : r(x) {}
    void show() {cout << r << endl;}
};
class demoCopy {
    int r;
public:
    demoCopy(int& x) : r(x) {}
    void show() {cout << r << endl;}
};
int main() {
    int x = 123;
    demoRef dRef(x);
    demoCopy dCopy(x);
    dRef.show();
    dCopy.show();
    x = 456;
    dRef.show();
    dCopy.show();
    return 0;
}

该代码产生如下输出:

123
123
456
123

Demo on ideone.

注意:这只是一个例子,说明你可以int的引用做什么。这并不意味着你应该做这样的事情而不需要特别小心,因为这样的隐藏引用会使你的代码更难阅读。

使用引用成员的原因有很多。一个来自标准库的例子是back_insert_iterator,它保持对容器的引用(或指针),以便调用该容器的push_back函数。

请注意,对于像这样存储指向另一个对象的引用或指针的任何类,您都需要像处理原始引用或指针一样小心。也就是说,您需要警惕悬空引用,并确保不会在引用的生命周期之后使用该引用。

当您在类中存储对变量的引用时,更改变量的结果是:

  1. 您可以在DoSomething的成员函数中更改变量,并使该更改在类外可见。
  2. 你可以改变DoSomething之外的变量,让这个变化在DoSomething中可见。
关键问题是:它在哪里有用?
  1. 我经常发现它在传递给标准库中某些函数的函子中很有用。

    @BenjaminLindley已经给了你一个很好的例子。

  2. 我经常发现它在工厂模式中很有用,当使用存储在具体工厂中的数据创建具体产品时,但是数据太昂贵而无法复制。

  3. 我已经在实现函数接口的类中使用了它。这些类在下列情况下保存对其他数据的引用:

    3.1。类需要访问数据,但复制数据的成本太高。

    3.2。复制数据是没有意义的,或者复制是设计禁止的(如std::ofstream)。

    3.3。该类需要更新数据并使其对调用代码可见。