看原型:
const string &manip(const string& s)
返回类型是 const string &
那么
return ret; 时不会返回ret的副本,而是返回ret本身,也就是ret的引用
如原型的返回类型是 const string ,那么 return ret 返回的就是ret的副本了
返回值还是引用取决于函数的返回值是如何定义的 ,因为返回值和返回引用的写法是完全一样的,所以只能从函数定义时的返回类型确定
函数定义的返回类型是const string&,ret是函数体内定义的string对象属于局部变量,根据函数定义可知在函数最后需要返回ret的const string引用,然而局部变量的作用域仅仅是函数体内,所以它的引用不会返回。
1. C++PRIMER说的对, 返回了局部变量的引用,子程序结束时,这个栈中变量已释放;
2. 引用的概念较难理解,平时除了 函数参数的引用传递外,一般不用;引用的本质就是
用地址表示这个变量;
3. 这个函数返回“引用”,并不是说 ret 是 “引用”,所以,你的最后说法是错误的。
4. 函数返回“引用”的古怪用法是当“左值”,如: manip(s)="123"; 怪吧。
首先,你定义了一个String类的对象ret 仔细看你的返回值类型是 string & 你return ret 后,它就会返回ret的引用给他 要注意的是函数结束后,ret被回收,不存在了 然后你指向ret变为空,这样会出现问题的,如果你要在函数创建一个对象,想要返回那个对象,一定不能用引用。
ret是局部变量
函数的返回值是个引用 const string&
局部变量在函数结束的时候会自动析构,所以返回的引用地址实际是个错误的地址