在c ++中引入引用背后的基本原理是什么?

时间:2011-01-17 18:20:31

标签: c++ reference rationale

从我最近的问题(Why is a c++ reference considered safer than a pointer?)中发生的讨论中,我提出了另一个问题:在c ++中引入引用的理由是什么?

5 个答案:

答案 0 :(得分:12)

Stroustrup Design and Evolution of C++的3.7节描述了对该语言的引用的介绍。如果您对C ++的任何功能背后的基本原理感兴趣,我强烈推荐这本书。

  

引用的引用主要是为了支持运算符重载。 Doug McIlroy回忆说,一旦我向他解释当前运营商重载方案的前身问题。他使用了 reference 这个词,其惊人的效果让我嘟“着”谢谢你“,并在第二天离开他的办公室重新出现,目前的计划基本完成。道格让我想起了Algol68。

     

C按值传递每个函数参数,并且按值传递对象的效率低或不合适,用户可以传递指针。在使用运算符重载的情况下,此策略不起作用。在这种情况下,符号方便是必不可少的,因为如果对象很大,则不能期望用户插入地址运算符。例如:

a = b - c;
     

是可接受的(即常规)符号,但

a = &b - &c;
     

不是。无论如何,&b - &c已经在C中有了含义,我不想改变它。

     

初始化后无法更改引用所指的内容。也就是说,一旦初始化C ++引用,就无法重新绑定它。我过去曾被Algol68引用所咬,其中r1 = r2可以通过r1分配给所引用的对象,或者为r1分配一个新的引用值(重新绑定r1 })取决于r2的类型。我想避免在C ++中出现这样的问题。

答案 1 :(得分:2)

你需要它们来进行运算符重载(当然我们现在可以在“引入运算符重载的理由是什么?”中找到了一个漏洞?)

如果没有引用,您如何键入std::auto_ptr::operator*()?或std::vector::operator[]

答案 2 :(得分:2)

引用隐式绑定到对象。当您考虑绑定到临时值或运算符重载之类的事情时,这具有很大的优势 - C ++程序将充满&和*。当你考虑它时,指针的基本用例实际上是一个引用的行为。另外,搞砸引用要困难得多 - 你自己不执行任何指针算法,不能自动从数组转换(一件可怕的事情)等。

引用比指针更清晰,更简单,更安全。

这很有意思,因为大多数其他语言没有像C ++这样的引用(别名),它们只有指针式引用。

答案 3 :(得分:0)

如果代码获取变量的地址并将其传递给例程,则编译器无法知道该地址是否可能存储在某个地方并在被调用例程退出后很长时间使用,并且可能在变量停止后存在。相反,如果代码传递给例程提供了对变量的引用,那么它可以更加确保引用仅在该例程运行时使用。该例程返回后,将不再使用该引用。

由于C ++允许代码获取引用的地址,事情最终会变得有点“破碎”。提供此功能是为了允许与期望指针而不是引用的旧例程兼容。如果引用被传递给一个占用其地址并将其存储在某个地方的例程,则所有的投注都会被关闭。另一方面,如果作为一个政策问题,禁止以任何可能持久的方式使用引用的地址,那么很可能获得引用所提供的保证。

答案 4 :(得分:0)

允许操作员重载。他们希望运算符对于对象和指针都是可重载的,因此他们需要一种通过指针以外的方式引用对象的方法。因此引用了参考文献。它出现在“C ++的设计和演变”中。