我正在尝试理解一个程序,其中包括函数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'是正确的?感谢您帮助理解它。
答案 0 :(得分:8)
const String& r
是String r的常量引用。在函数中,您可以像String一样访问r
。不同之处在于它实际上是对传递给函数的对象的引用,而S
将是传递给函数的对象的副本。您可以几乎将其视为通过取消引用的指针访问r
(尽管它还有更多内容)。
另一种查看方式:来电者会看到r
的更改(如果不是const
),而他看不到S
的更改。
const
只表示函数f
无法修改r
。
答案 1 :(得分:0)
这似乎只是一个例子,以显示传递参数的方式之间的差异。
您可以按值传递一个参数的一个实际情况是,无论如何您需要值的副本。也许在连接两个字符串时。