一、声明为const的原因:
- 把函数不会改变的形参定义成普通的引用会带给函数的调用者一种误导,即函数可以修改它的实参的值;
- 限制函数所能接受的实参类型,如不能把const对象、字面值或者需要类型转换的对象传递给普通引用的实参。
举例:对于附录中的“find_char函数”,由于我们把其中的string类型的形参定义成普通的string&,故只能将find_char函数作用于string对象,对于下面这样的调用,将在编译时发生错误。
find_char("Hello World", 'o');
二、声明为引用的原因:
避免拷贝,除了考虑效率问题,某些类型并不支持拷贝操作,此时只能使用引用形参
使用引用形参可返回额外信息
三、注意事项
const形参的顶层const将被忽略,故要注意不要如下重载函数:
void func(const int x) // 顶层const
{
cout << x << endl;
}
/*
void func(int x)
{
cout << x << endl;
}
*/
解释:因为顶层const将被忽略,我们传入两个func函数的实参可以完全一样,这样编译器将不知调用哪个函数。
附录:
【find_char程序】
#include <iostream>
#include <string>
using namespace std;
string::size_type find_char(string &s, char c)
{
int ret = s.size(); // 最大索引值 + 1
return ret = s.find(c);
}
int main()
{
string ss("hello");
int first_pos = find_char(ss, 'a');
if (first_pos == -1) {
cout << "Not find!\n";
}
else {
cout << "first find at " << first_pos << endl;
}
return 0;
}