C++ 为什么我们在类的私有部分将变量声明为引用

C++ 为什么我们在类的私有部分将变量声明为引用,c++,class,object,pointers,C++,Class,Object,Pointers,我知道在函数中将变量声明为引用或指针是多么有用,但我只是想知道为什么我们在类的私有部分将其声明为引用 范例 class DoSomething { private : int& t_; // why not just 'int t;' }; 如果我们在没有引用的情况下声明变量,并将类的对象定义为指针或引用,会怎么样?这不是好的做法吗 如果将变量声明为int,那么它的值将与初始化它的变量分离。如果将其保留为引用,则变量将跟踪已初始化的变量: class demoRef { i

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

范例

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;
}

注意:这只是一个对int的引用的示例。这并不意味着你不需要特别小心就可以这样做,因为这样的隐藏引用会使你的代码更难阅读。

你可能有一个引用成员的原因有很多。标准库中的一个示例是,它保留一个指向容器的引用或指针,以便调用该容器的push_back函数


请注意,对于像这样存储指向另一个对象的引用或指针的类,您需要像对待原始引用或指针一样小心。也就是说,您需要警惕挂起的引用,并确保在引用对象的生存期之后不使用引用。

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

您可以更改DoSomething的成员函数中的变量,并使该更改在类外可见。 您可以在DoSomething外部更改变量,并使该更改在DoSomething内部可见。 关键问题是:它在哪里有用

我经常发现它在传递给标准库中某些函数的函子中很有用

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

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

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

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

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

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


您可以将它们声明为公共或受保护。这取决于上下文和程序员的需要。但是,您必须在构造函数的初始化列表中初始化它们。我认为您误解了public、protected和private的含义。例如,查找封装。这是一个与指针/引用或任何类型正交的概念,它与私有或公共无关。我只想知道为什么它在类中将变量声明为引用时很有用。我想的是,即使一个人给出了一个没有引用的变量,这个变量仍然与一个对象相关联,那么我们给出引用还是没有引用会有什么区别,当对象被破坏时,它的所有变量都会被破坏,所以我不知道人们为什么给出引用?。我问这个问题是想知道在什么情况下引用是有用的?这不是什么大问题,也不是什么简单的要求。当人们否决这个问题时,请他们告诉我们为什么他们否决了这个问题,以便将来我们能更好地了解。这个问题主要是基于意见的,太广泛了。非常感谢,它帮助我澄清了我的概念。@Sahu,非常感谢。谢谢你,伙计。。与包括你在内的其他人一起,这有助于我更好地理解课堂教学
123
123
456
123