C/C++函数形参包含字符&以及const
假定现在有个函数声明:
void foo(const int &a)
这里的const以及&有什么作用呢?
考虑如下四种情形:
void foo(int a)
void foo(const int a)
void foo(int &a)
void foo(const int &a)
下面我们一一进行对比:
情形1:
#include <iostream>
using namespace std;
void foo(int a)
{
/*这里的变量a仅仅是main作用域中变量a的一个副本,一个copy,对于副本的修改,不会影响到main作用域中变量a的值*/
a = 10;
}
int main()
{
int a = 20;
cout<<a<<endl;
foo(a);
cout<<a<<endl;
return 0;
}
情形2:
#include <iostream>
using namespace std;
void foo(const int a)
{
/*对const类型的变量进行修改将会出错*/
a = 10;
}
int main()
{
int a = 20;
cout<<a<<endl;
foo(a);
cout<<a<<endl;
return 0;
}
[jiang@eb50 04]$ g++ -o main main.C
main.C: In function ‘void foo(int)’:
main.C:8: 错误:assignment of read-only parameter ‘a’
情形3:
#include <iostream>
using namespace std;
void foo(int &a)
{
/*此时a是引用传递,所以,修改foo中的a实际是修改main作用域中的a,换句话说,foo中与main中的a是同一个*/
/*在main中进行foo(a);调用时没有为a创建新的变量(如果是值传递,那么将创建新的变量并将现有变量的值copy到新变量中)*/
a = 10;
}
int main()
{
int a = 20;
cout<<a<<endl;
foo(a);
cout<<a<<endl;
return 0;
}
[jiang@eb50 04]$ g++ -o main main.C
[jiang@eb50 04]$ ./main
20
10
情形4:
#include <iostream>
using namespace std;
void foo(const int &a)
{
//a = 10;
}
int main()
{
int a = 20;
cout<<a<<endl;
foo(a);
cout<<a<<endl;
return 0;
}
现在总结下:
在形参中用const修饰的变量,无论其是否是引用都不能被修改;
形参中变量前加字符&代表引用传递,也即:在主调函数调用被调函数时,不再建立形参的副本,而是直接把引用传递过去,类似将指针传递过去,对引用的修改将会反映到主调函数中。
加上&可以节省空间,提高效率,尤其是当参数为复杂的数据类型时尤为有用~但是又担心,万一不小心修改了,那岂不是会影响主调函数吗?那就加上const吧,就是上面的情形4,既具有引用传递的优点,还可以防止不小心修改错误。
如果我解释得不清楚,可以参考:
http://bbs.csdn.net/topics/320068352
本文也是来源于这边文章进行试验所得~
参考资料: