浅析C++的引用与const指针与各种传递方式
浅析C++的引用与const指针与各种传递方式
首先我们知道constint*p与intconst*p是一样的,即*p是常量;而int*constp跟上面是不一样的,即p是常量;我们知道引用只是一个别名,与变量共享存储空间,并且必须在定义的时候初始化,而且不能再成为别的变量的别名,这让我们想到什么呢,貌似跟 int*constp 的性质很像。
其实引用的底层就是用const指针来实现的。下面举个小例子:
#includeusingnamespacestd; voidswap(int&x,int&y) { inttemp=x; x=y; y=temp; } voidswap(int*constx,int*consty) { inttemp=*x; *x=*y; *y=temp; } intmain(void) { inta=5; intb=6; swap(a,b); cout<<"a="< 其实两个swap函数达到的效果是一样的(namemangling),而const引用如constint&呢我们也可以类比为 constint*constp即既不能成为别的变量的引用,也不能通过引用更改变量的值。
引用经常作为函数的参数传递,可以与值传递,以及指针传递做个比较:
值传递:实参初始化形参时要分配空间,将实参内容拷贝到形参
引用传递:实参初始化形参时不分配空间
指针传递:本质是值传递,但如果我们要修改指针本身,那只能使用指针的指针了,即**,或者指针引用*&
而且使用指针比较不保险的是很多人会忘记加上const的限制,即很可能接下来的程序中你又把这个指针指向了其他的变量,这样就混乱了。
把引用作为函数返回值时,千万记得不要返回局部变量的引用,举个小例子:
#includeusingnamespacestd; int&add(inta,intb) { intsum; sum=a+b; returnsum; } intmain(void) { intn=add(3,4); //cout<<"justtest"< 在上面的例子中我们返回了局部变量的引用,那么输出结果是什么呢?
n2=11 n=7好像没错是吧,再试试,我们在最后加一条语句再打印一下n2
cout<<"n2="<奇怪了,为什么这次打印变成这么大的数而我们完全没更改n2的值啊?见到的不一定是真的啊,不要被它欺骗了,这就是返回局部变量的引用的后果。
其实函数返回的是局部变量sum的引用,而n2本身又是引用,即引用着原来sum拥有的那块区域,第一次打印没有出错是因为本来写在sum区域上的值11尚未被覆盖,而再运行两条打印语句后再次打印,很可能原来属于sum的区域变dirty了,被覆盖了其他不确定的值,每次打印都不会是一个定值。
那n呢,对n来说即使你最后再打印一下,n还是等于7,因为n本身是个变量,函数返回时立马保存了sum所属区域的值,除非你对n更改,不然n在main函数堆栈中是不会变化的,直到函数退出,变量释放。大家要比较清晰的是,局部变量在函数栈上释放,但本来区域的值第一时间还是原来的值,但经过程序运行,堆栈内存区域重用,一般就被覆盖了。
以上就是C++的引用与const指针与各种传递方式,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。