关于c++引用修饰函数返回值的问题

引用修饰函数返回值,可以把返回值作为左值进行修改,比如
char &get_val(string &str,string::size_type ix)
{
return str[ix];
}
使用语句调用:
string s("123456");
cout<<s<<endl;
get_val(s,0)='a';
cout<<s<<endl;
把函数应用于左值,如上代码,最后运行结果s改变成“a23456“,此处由于形式参数和返回值都是引用,因此最后返回的其实是s对象的引用,所以在外部改变时,真正的s也跟着改变了.......
但是实际中还经常有这样的写法,如下:
const char &get_val(string &str,string::size_type ix)
{
return str[ix];
}
既然使用&修饰函数返回值了,那为什么又要加上const,不让他改变呢。。。这不多此一举,矛盾吗?

返回引用不一定都是为了做左值,
返回引用本质为了不复制返回值而直接返回的是对象本身
比如
const int &max(const int &a, const int &b)
{
return a>b?a:b;
}
这样不会复制返回值,但这个函数是只读,不做左值

好比引用参数,并不都是为了改变参数,经常为了不调用拷贝构造函数而使用引用类型,如拷贝构造函数就必须使用引用参数。返回引用同样这样,为了不复制返回值
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-08-02
楼上正解.

返回const引用的地方最常见的还是类的const成员函数.

比如说, 自己定义一个string类型, 需要为其重载下标[ ]操作符.
char& operator[](size_t index) { return _Myptr[index]; }
const char& operator[](size_t index) const{ return _Myptr[index]; }

其中后者 必须 是返回const引用
因为通过下标来改变一个const string的字符在逻辑上是不允许的. 语法也不该允许.

看得懂解析——C++引用做返回值
要解决此问题,需避免引用局部变量,因为局部变量在函数结束时将自动释放。故引用作为返回值时,不可返回局部变量的引用,而允许引用作为左值。理解引用实质为指针常量有助于深入理解,指针常量的概念能有效辅助理解。引用作为返回值的使用需留意局部变量的生命周期,避免引用局部变量的错误。综上所述,C++引...

C++返回引用的问题
故在用函数返回值定义一个引用(int &ia = Func1())时,该引用为临时变量的引用,由于临时变量作用域短暂,故该引用存在随时无效的危险。而用引用返回值时,由于不产生值的副本,故int &i = func2();在func2()的返回值是一个静态或者全局变量的情况下的调用是合法可行的,其直接用全局数据区中...

C++高手请进按引用返回值应注意什么
(1)不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。(2)不能返回函数内部new分配的内存的引用。这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题...

C++ 返回值 引用
引用引用的也是地址,cout<<语句会将地址重新定向,所以返回的地址就不再是引用原来那个值了。就会出现一个奇怪的值。(我执行结果是b:4198699)可以用两个改进办法,一个是把那两句int& f(int &a);改成int f(int &a);这样返回的是值而不是引用,就不会错了。第二个是把子函数里 int c;改...

C++ 引用问题
就是说在函数ls创建了一个类A的对象m 然后返回m的引用 但是m的引用是什么"引用就是别名" 比如说A &z = x;就是说z是x的别名 z是我起的x的另一个名字但是这个地方我没有给m起一个别名啊 他怎么返回的别名 c和c++的参数传递都是按值拷贝,返回值也是,如果不是引用,则返回m的一个拷贝,...

c++ 函数返回引用问题
首先,永远不要返回局部变量的引用。因为局部变量在函数返回时被回收,即这个变量不存在了,所以以后对这个变量的引用都是无意义的,结果是不可预知的,程序很可能会崩溃。因此,也就不解释这种情形的结果了。由于静态变量的声明周期直到程序结束,所以返回静态变量的引用是有意义的,而且安全的。下面解释...

C++函数返回引用问题
C++为“引用“赋于了新的内涵:当函数的形式参数使用“引用类型”时,函数内对“引用”的操作可以改变原变量的值,而用变量类型作形式参数时是拷贝传值,没有这种优势。返回”引用“的函数在函数名前加一个&,再前面是类型名,比如int &index()是返回一个int型“引用”,因为“引用”是int型某变量...

c++ 返回值与返回引用以及生命周期总结
接下来,让我们探讨在使用不同类型的函数时,我们应该关注什么类型以及返回引用时的对象生命周期限制。在C++中,我们通常会考虑返回string类型的函数,或使用const std::string &或 std::string &的函数。这些函数的返回值会触发不同的行为。当函数返回std::string时,通常情况下编译器会进行返回值优化(...

谁知道C++中“引用”作为函数返回值的好处
用引用,可以使函数调用作为左值.引用表达式是一个左值表达式,因此它可以出现在形、实参数的任何一方。若一个函数返回了引用,那么该函数的调用也可以被赋值。一般,当返回值不是本函数内定义的局部变量时就可以返回一个引用。在通常情况下,引用返回值只用在需要对函数的调用重新赋值的场合,也就是对...

c++函数返回引用
int sum()返回int,就好像5 = 1,怎么能赋值。int* sunm()返回的是地址,指针赋值是 *p = 6;这么写的

相似回答