关于运算符重载的问题

时间:2011-03-07 03:37:15

标签: c++ operator-overloading

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

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

}

这里参数中的字符串代表一个类。我对这两个参数的定义之间的区别感到困惑:“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'      
 }

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

2 个答案:

答案 0 :(得分:8)

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

另一种查看方式:来电者会看到r的更改(如果不是const),而他看不到S的更改。

const只表示函数f无法修改r

另请参阅:https://isocpp.org/wiki/faq/references#overview-refs

答案 1 :(得分:0)

这似乎只是一个例子,以显示传递参数的方式之间的差异。

您可以按值传递一个参数的一个实际情况是,无论如何您需要值的副本。也许在连接两个字符串时。