C/C++函数形参包含字符&以及const

来源:互联网 发布:手机显示yy网络不给力 编辑:程序博客网 时间:2024/05/01 08:50

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 2010

情形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

本文也是来源于这边文章进行试验所得~

参考资料:

1.http://bbs.csdn.net/topics/320068352

0 0
原创粉丝点击