C ++中的引用

时间:2010-04-03 04:45:32

标签: c++

一旦我在声明中读到

  

语言功能“密封了   处理“包含引用是   运算符重载。

为什么需要引用才能有效地支持运算符重载?有什么好的解释吗?

4 个答案:

答案 0 :(得分:10)

这是Stroustrup在“C ++的设计和演变”(3.7“引用”)中所说的:

  

引用的引用主要是为了支持运算符重载。 ...

     

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

 a = b - c;
     

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

 a = &b - &c;
     

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

答案 1 :(得分:4)

一个明显的例子是“>>”的典型重载作为流提取操作符。要按设计工作,必须能够修改左手和右手参数。必须修改权限,因为主要目的是将新值读入该变量。必须修改左侧以执行指示流的当前状态等操作。

理论上,您可以将指针作为右侧参数传递,但是对左侧参数执行相同操作会有问题(例如,当您将运算符链接在一起时)。

编辑:左侧的问题变得更多,部分原因是重载的基本语法是x @ y(其中“@”代表任何重载的运算符)意味着x.opertor@(y)。现在,如果您更改规则以便以某种方式将x转换为指针,则会很快遇到另一个问题:对于指针,很多这些运算符已经具有与重载分开的有效含义 - 例如,如果我翻译x+2以某种方式神奇地使用指向x的指针,那么我已经产生了一个已经具有与重载完全分离的含义的表达式。要解决这个问题,您可以(例如)决定为此目的,您将生成一种不支持指针算法的特殊指针。然后你必须处理x=y - 所以特殊指针变成你不能直接修改的指针,并且任何分配给它的尝试最终会分配给它指向的任何东西。

我们只限制它们足以支持两个运算符重载,但我们的“特殊指针”已经有大约90%的方式成为具有不同名称的引用...

答案 2 :(得分:1)

引用构成了一种标准方法,用于指定编译器应该像对象本身一样处理对象的地址。这非常适合运算符重载,因为操作通常需要在表达式中链接;要使用统一的接口来完成此操作,即完全通过引用,您通常需要获取临时变量的地址,这在C ++中是非法的,因为指针不能保证其所指对象的生命周期。另一方面,参考文献也是如此。使用引用告诉编译器使用某种特定的魔法(至少有const个引用)来保留指示对象的生命周期。

答案 3 :(得分:0)

通常,当您实现一个操作符时,您希望直接在操作数上操作 - 而不是它的副本 - 但传递一个指针就有可能删除操作符内的内存。 (是的,这将是愚蠢的,但它仍然是一个重大的危险。)引用允许一种方便的方式允许指针式访问,而无需传递指针的“责任分配”。