传引用参数和传值参数相比更适合哪些场景?
-
传引用优势
- 可以直接操作所引的对象;
- 可以避免拷贝打的类类型对象、容器类型对象;
- 有助于从函数中返回多个值,即便于将函数内对实参值的更改反映在函数外部;
-
当函数目的是交换两个参数的内容 / 参数是string 对象时,应使用传引用方式;其他在参数拷贝代价很低或者无需操作对象内容的情况下使用普通变量作为参数即可。
for (auto c : str) // 此处用传值参数,仅拿到字符串中每一个字符的复制进行判断
for (auto &c : str) // 此处用传引用,操作后可以实际改变字符串对象
例子:查找大写字符,并最终改写为小写
#include <iostream>
#include <string>
using namespace std;
// 实现判断字符串是否有大写字符,不进行修改,因此设为常量引用
bool HasUpper(const string& str) {
for (auto c : str) // 此处用传值参数,仅拿到字符串中每一个值的复制进行判断
if (isupper(c))
return true;
return false;
}
// 实现字符的改写,因此设为非常量引用,便于修改
void changeToLower(string& str) {
for (auto &c : str) // 此处用传引用,操作后可以实际改变字符串对象
c = tolower(c);
}
int main()
{
cout << "enter a string: " << endl;
string str;
cin >> str;
if (HasUpper(str)) {
changeToLower(str);
cout << "after change: " << str << endl;
} else {
cout << "There is no upper char." << endl;
}
return 0;
}
上述在改小写函数中,如果在循环遍历中,仍然想要坚持使用传值参数for (auto c : str)
,那么它的改变仅存在它的作用域内,并不会对最终的字符串有任何影响;除非将每次改写后的字符重新放到一个新字符串内,等函数进行结束后返回这个字符串,如此才得以实现保留它的修改。
// 重新定义改小写函数
string changeToLower(string& str) {
string str1; // 使用新容器存放修改后的字符
for (auto c : str) // 此处设为传值参数
str1.push_back(tolower(c)); // 保存修改后的结果
return str1;
}