关于运算符重载的问题

use*_*983 3 c++ operator-overloading

我试图理解一个程序,其中包括函数f的以下定义

void f(String S, const String& r)
{

}
Run Code Online (Sandbox Code Playgroud)

这里参数中的String代表一个类.我对这两个参数的定义之间的区别感到困惑:"String S"和"const String&r".S应该代表String类的对象,那么r怎么样?

更详细地,f定义为

void f(String S, const String& r)
{
   int c1 = S[1];  // c1=s.operator[](1).operator char( )
   s[1] ='c';      // s.operator[](1).operator=('c')

   int c2 = r[1];  // c2 = r.operator[](1)
   r[1] = 'd';     // error: assignment to char, r.operator[](1) = 'd'      
 }
Run Code Online (Sandbox Code Playgroud)

这段代码片段用于显示运算符如何重载,但这些注释对我没什么帮助.例如,为什么r [1] ='d'是正确的?感谢您帮助理解它.

dap*_*wit 8

const String& r是String r的常量引用.在函数中,您可以r像String一样访问.不同之处在于它实际上是对传递给函数的对象的引用,而S将是传递给函数的对象的副本.您几乎可以将其视为r通过取消引用的指针进行访问(尽管它有更多内容).

查看它的另一种方法:调用者将看到更改r(如果不是const),而他将看不到更改S.

const仅仅意味着该函数f不能修改r.

另见:https://isocpp.org/wiki/faq/references#overview-refs