#include<iostream>
using namespace std;
int f(const int &a){return a;}
int g(int &a){return a;}
int h(int a){return a;}
int main(){
int x=3;
cout<<f(x)<<endl;
cout<<f(3)<<endl;
cout<<g(x)<<endl;
//cout<<g(3)<<endl;//error: invalid initialization of non-const reference of type 'int&' from a temporary of type 'int'
//error: in passing argument 1 of `int g(int&)'
cout<<h(x)<<endl;
cout<<h(3)<<endl;
}
常数没有地址,对于常数的引用必须是个const&,
同样的,如果x是个const的话,int g(int &a){return a;}也会报错:
结论:
如果不需改变形参的值又不用作参数传递(实参赋值给形参),用常引用作形参适应面最广:实参可以是变量也可以是常量。
如果需要改变形参的值,用引用作形参最合适:实参必须是变量不允许是常量。
如果不需改变形参的值又可以用作参数传递(实参赋值给形参),用普通变量作形参:多了传递参数的开销。
对比一般引用作形参和常引用作形参
一般引用作形参:
- 不用作参数传递(实参赋值给形参),节省开销,提高效率。
- 函数可以改变形参的值
- 实参不能是常量
常引用作形参有3个作用:
- 不用作参数传递(实参赋值给形参),节省开销,提高效率。
- 函数不能改变形参的值
- 实参可以是常量