传引用参数
对于引用的操作实际上是作用在引用所引的对象上:
int n = 0,i = 42; int& r = n;//r绑定了n(即r是n的另一个名字) r = 42;//现在n的值是42 r = 1;//现在n的值和i相同 i = r;//i的值和n相同
使用引用形参,允许函数改变一个或多个实参的值。
改写reset程序,使其接受的参数是引用类型而非指针:
void reset(int& i) {//i是传给reset函数的对象的另一个名字 i = 0;//改变i所引用对象的值 }
和其他引用一样,引用形参绑定初始化它的对象。当调用reset函数时,i绑定我们传给函数的int对象,此时改变i也就是改变i所引对象的值,被改变的对象是传入reset的实参。
int j = 42; reset(j);//j采用传引用方式,它的值被改变 cout << "j = " << j << endl;//输出j=0
使用引用避免拷贝
拷贝大的类类型对象或者容器对象比较低效,甚至有的类类型根本就不支持拷贝操作。当某种类型不支持拷贝操作时,函数只能通过引用形参访问该类型的对象。
比较两个string对象的长度:
- string对象可能会非常长,应该尽量避免直接拷贝它们
- 比较长度无须改变string对象的内容
bool isShorter(const string& s1, const string& s2) { return s1.size() < s2.size(); }
使用引用参数返回额外信息
一个函数只能返回一个值,然而有时函数需要同时返回多个值,引用形参为我们一次返回多个结果提供了有效的途径。
给函数传入一个额外的引用实参,令其保存字符出现的次数:
//返回s中c第一次出现的位置索引 //引用形参occurs负责统计c出现的总次数 string::size_type find_char(const string& s, char c, string::size_type& occurs) { auto ret =s.size();//第一次出现的位置 occurs = 0;//设置表示出现次数的形参的值 for (decltype(ret) i=0;i!=s.size();++i ) { if (s[i] == c) { if (ret == s.size()) ret = i;//记录c第一次出现的位置 ++occurs;//将出现的次数加1 } } return ret;//出现的次数通过occurs隐式地返回 }

浙公网安备 33010602011771号