首先我们执行如下程序:
#include<iostream>
#include<string>
using namespace std;
int main(){
string string="Gdkknvnqkc";
for(auto s:str)
s+=1;
for(auto s:str)
cout<<s;
cout<<endl;
for(auto &s:str)
s+=1;
for(auto s:str)
cout<<s;
cout<<endl;
return 0;
}
运行结果如下:
Gdkknvnqkc
Helloworld
从运行结果,我们可以注意到,第一个范围for对字符串 str 中的字符没有产生任何影响,但是第三个范围 for 却对原字符串产生了影响。
这是因为第一个范围 for 将字符串中字符赋值给对象 s ;再执行 s +=1; 只是 s 的值对应的ASCII值增加1,没有对原字符串进行任何操作,所以原字符串不会发生任何改变。
而第二个范围 for 是以引用的形式遍历字符串的字符,每一次对 s 的操作都是对原字符串的操作,所以经过第一个范围 for 的操作后,原字符串变为Helloworld。
那么我们来思考一个问题:
编写一个函数 swap ,在主函数中定义两个int型变量,并初始化赋值(两个变量初始化赋值不同),调用 swap 函数实现两个变量值的交换。
这里我们推荐两种方法:一种是我们刚刚讲述的引用,将函数定义为 swap(int &x,int &y){…},另一种就是利用指针,将函数定义为 swap(int *x,int *y){…};大家不妨把程序补充完整,并与函数swap(int x,int y){…}对比。看三个函数定义方式的不同。
答案可以参考
指针、引用作函数形参的比较
更多精彩内容请关注微信订阅号“编程语言初学者”,我们会将不同网站发布的博客、推文统一发布于编程语言初学者订阅号。