string &retLocal()这个里面的加了这个&和不加有什么区别吗?
我怎么感觉没区别
另外,retLocal这个函数不应该没有返回值吗?
string &retRef是一个局部变量的引用,按理而言,引用出了retLocal这个函数传到主函数后,应该就没有值了呀?
还有为什么我没有#include 也可以使用string ?
先看个例子然后再针对你提问的问题细说:
你提问的问题:
(1)函数类型后面带&,表示返回的是一个引用,不带&表示返回的是一个值。
带&的时候,函数再返回时,返回的就是函数内的同一个变量!!!(记住这句话)。
不带&的时候,函数返回时,回对返回值进行一次复制,如果返回的是一块大内存,不带引用回降低程序的效率。
所以,带不带&实际上区别很大。
(2)string &retRef是一个局部变量的引用,按理而言,引用出了retLocal这个函数传到主函数后,应该就没有值了.
你的这句,理解是对的,跟我(1)中让记住的那句话是一个道理。
所以,出了函数后,实际上retRef已经被回收了,在你的代码中能够正常显示,是因为分配给retRef变量的内存还没有被其它变量占用,所以能输出。你再对比我上面的贴图,我贴图中返回的是一个数组,再main函数中打印数组的时候,跟fun函数中的值就完全不一致!!
(3)因为iostram库中引用了string类型,所以,包含了iostream后,能够使用string类型定义变量,但是,iostream中没有strlen()、strcpy()等这些函数,如果需要使用这些函数,则需要包含string头文件
加上&表示返回的是一个引用,不加&表示返回的是一个拷贝。
你的代码中,加上&表示返回的是ret这个局部变量的引用,不加&表示返回的是ret的拷贝,但是由于返回的是一个引用,所以retRef仍然指向ret这个局部变量,因此在主函数中输出retRef的值时,输出的是ret的值。
关于函数没有返回值的问题,实际上retLocal函数返回了一个引用,即retRef,因此它是有返回值的。
至于为什么可以使用string而没有#include,可能是因为在其他头文件中已经包含了string头文件,或者是编译器自带了string头文件。
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!