拥有一个引用类型的类成员有什么作用?

6
我来翻译一下:

我有这段代码,但它并不是一个实用的例子。

例如:

class Animal
{
   int i;
   int& ref;
   public:
   Animal() : ref(i)
   {
   }
};

有没有人能提供一个现实生活中的例子,说明为什么需要将ref作为类成员,以便我更好地理解它?


1
@pst:这完全与主题无关。C++引用是不能重新绑定的,因此提供可重新绑定引用的示例并没有任何意义。 - Ben Voigt
@BenVoigt 并不是完全无关紧要(我创建的大多数类型都避免了突变/具有“readonly”成员)。不过你的确有一个非常有效的观点。 - user166390
@user966379,我认为你需要重新表达你的问题,改为“在同一个类中拥有一个引用类型成员变量指向另一个成员变量的目的是什么?”这将有助于未来的网络搜索。 - Murali Krishna
3个回答

3

每当某个类A的多个对象都需要引用同一个共享实例时,或者例如几个People都有相同的母亲和/或父亲:

class Person {
    private:
      Person &mother_;
      Person &father_;

    public:
      Person(Person &mother, Person &father) : mother_(mother), father_(father) {}
      // ...
}

3
为了 OP 的利益,这被称为聚合,在面向对象编程中常被使用。 - Chris Parton
1
这并不解释为什么你会使用引用而不是指针,因为引用不能被重新绑定,而指针可以。通过使用引用,您确保必须有一个拷贝构造函数。 - Nicol Bolas
1
@PST:我认为聚合的概念比你的描述更广泛。据我所知,聚合只是组合的一种变体,其中聚合对象的生命周期不受包含对象的生命周期的限制。例如,如果一个“人”被销毁,他们的“母亲”和“父亲”并不会被销毁(这是一个相当恐怖的例子,我知道)。在组合关系中,情况就不同了。维基百科似乎也有同样的看法:http://en.wikipedia.org/wiki/Object_composition#Aggregation。 - Chris Parton
这个例子没有提到一个引用变量引用同一类中的成员。或者,我理解错了吗? - Murali Krishna
@ChrisParton 感谢您提供的链接,而且辩护得很好 :) - user166390
显示剩余3条评论

1

当然:模板类 std::reference_wrapper<T> 的整个目的就是为了保存一个引用!

这有很多用途。例如,您可以将其传递给 std::thread 构造函数(它总是会复制)。您还可以创建引用包装器的容器。

在您想要包装输出流时,保留对某些内容的引用也可能非常有用;您将原始流作为引用保存,并向其中添加内容(例如,this answer of mine 可以通过向包装对象添加对底层流的引用来改进)。


std::reference_wrapper是C++11标准吗?我还没有完全阅读标准。 - Adrian Cornish

1

这与 const 指针基本相同。如果您需要一个非空指向其他对象的指针,并且该指针仅在构造期间分配,那么您可以选择使用引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接