时间:2021-05-19
浅析C++的引用与const指针与各种传递方式
首先我们知道 const int *p 与 int const *p 是一样的,即 *p 是常量;而 int * const p 跟上面是不一样的,即 p 是常量;我们知道引用只是一个别名,与变量共享存储空间,并且必须在定义的时候初始化,而且不能再成为别的变量的别名,这让我们想到什么呢,貌似跟 int * const p 的性质很像。
其实引用的底层就是用const指针来实现的。下面举个小例子:
其实两个swap函数达到的效果是一样的(name mangling),而const 引用如 const int & 呢我们也可以类比为 const int * const p 即既不能成为别的变量的引用,也不能通过引用更改变量的值。
引用经常作为函数的参数传递,可以与值传递,以及指针传递做个比较:
值传递: 实参初始化形参时要分配空间, 将实参内容拷贝到形参
引用传递: 实参初始化形参时不分配空间
指针传递:本质是值传递,但如果我们要修改指针本身,那只能使用指针的指针了,即 **, 或者指针引用 *&
而且使用指针比较不保险的是很多人会忘记加上const的限制,即很可能接下来的程序中你又把这个指针指向了其他的变量,这样就混乱了。
把引用作为函数返回值时,千万记得不要返回局部变量的引用,举个小例子:
在上面的例子中我们返回了局部变量的引用,那么输出结果是什么呢?
好像没错是吧,再试试,我们在最后加一条语句再打印一下 n2
奇怪了,为什么这次打印变成这么大的数而我们完全没更改n2的值啊? 见到的不一定是真的啊,不要被它欺骗了,这就是返回局部变量的引用的后果。
其实函数返回的是局部变量sum的引用,而 n2 本身又是引用,即引用着原来sum 拥有的那块区域,第一次打印没有出错是因为本来写在sum 区域上的值11 尚未被覆盖,而再运行两条打印语句后再次打印,很可能原来属于sum 的区域变 dirty了,被覆盖了其他不确定的值,每次打印都不会是一个定值。
那 n 呢,对 n 来说即使你最后再打印一下, n 还是等于 7,因为 n 本身是个变量,函数返回时立马保存了sum 所属区域的值, 除非你对 n 更改,不然 n 在main 函数堆栈中是不会变化的,直到函数退出, 变量释放。大家要比较清晰的是,局部变量在函数栈上释放,但本来区域的值第一时间还是原来的值,但经过程序运行,堆栈内存区域重用, 一般就被覆盖了。
以上就是C++的引用与const指针与各种传递方式,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C++引用与指针的比较引用是C++中的概念,初学者容易把引用和指针混淆一起。一下程序中,n是m的一个引用(reference),m是被引用物(referent)
C++中引用与指针的区别实例详解引用是从C++才引入的,在C中不存在。为了搞清楚引用的概念,得先搞明白变量的定义及引用与变量的区别,变量的要素一共有两个:名称与
数组:复制传递(不要按照c/c++的方式去理解,c/c++中数组是引用传递),定长切片:引用传递,底层实现是3个字段array(数组)+len(长度)+cap(
介绍引用是C++中特有的语法,在C语言中不存在。本质上引用(reference)就是指针,在类型名后面加上一个&号就是引用类型。1.指针与引用的定义进行比较指针
C++中const对象与const成员函数的实例详解const对象只能调用const成员函数:#includeusingnamespacestd;classA{