c++返回引用的问题

String String::operator+(const String&c_string){
String tmp;
tmp=*this;
strcat(tmp._string,c_string._string);
return tmp;
}
这是我的函数,我不太清楚到底局部声明的“对象”在函数外面利用引用是否存在,这里是不是把返回值写出String&好一点,String*又怎么样了?(不考虑外面怎么使用这个函数)
前面的问题我大概理解了,下面这种情况行不行了
还有个问题,A *func(){A *d=new A();return A;}这种行不行了?我看C++primer上有个这样的函数,但是我觉得如果按照 三六一十九 的解答,这种应该也是不行的?

这要从函数的调用过程分析,你应该知道,一个函数的参数如果不是引用的话,那么这个参数仅仅是一个值的拷贝,在函数体内对参数的任何操作不会影响这个参数的原值。对于函数的返回值,如果不是引用,那么只是暂时性的,举个例子,一个函数返回了一个int变量,那么当这个变量返回给外部使用后,这个变量的内存就立刻被系统回收了,也就是说这个值再也不存在了。

如果返回一个类的对象的话,建议还是把返回值写成引用的形式,这样做有两个好处,第一个是保证了返回的类一定是存在的,否则有可能已经被析构了导致错误,第二个是提高了程序的效率,因为省去了复制的过程,这是因为函数返回后,系统产生一个匿名对象,并复制为返回的对象,之后你使用的都是这个匿名对象,原先返回的对象早就不存在了,举个例子,这是函数申明:A f(void);,其中A是一个类,A有一个成员对象member,那么可以这么写:f().member,意思是调用f的返回值的member变量。其实你的返回值早就被析构了,你之所以可以这么用,是因为系统生成了一个匿名类对象,并复制成返回的那个类对象,所以你才可以这么用。有些复杂,不知道明白了没有,因为这个确实不是很好理解。
至于返回一个类的指针,那就更不对了,因为在函数中使用了对象都会被析构,所以这个返回的指针实际上是一个野指针,几乎注定要崩溃,除非你所指向的类对象是一个static静态属性的。
而引用就不一样了,引用告诉了计算机,你不必给我复制一个副本,直接给我把本人叫来,我要亲自操作它!系统知道有地方还要使用这个类对象,所以不会产生一个匿名类对象,而原先的返回值也不会被析构。

引用的唯一隐患就是安全性的问题,因为你是直接操作原始数据,所以一旦发生误操作,结果是无可避免的,这就是为什么用const来修饰引用的参数,这样保证了被引用的变量无法修改,同时提高了程序的运行效率
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-02-15
局部声明的“对象”在函数外面利用引用不存在。
既然是局部声明的,当然就是局部变量啦。
返回值就写string就行了。

你写的是重载+运算符,使它作为连接字符串运算符
-----------------下面是我改写的函数-------------------
String String::operator+(const String&c_string)
{
strcat(_string,c_string._string);
return (*this);
}
--------------------你去试下看看-----------------------
第2个回答  2011-02-16
You must not return a String& or a String*, because the String tmp is destructed when the function ends. And then, what the String& refers to? A refference must refer to something when it is initlized! As well, return a pointer is not right. In the end what the pointer pointed to? A destructed String? It's not safe! It's a bad pointer!
第3个回答  2011-02-16
函数返回整形的n,那么系统会建一个临时变量存储n
int ABC()
{
int n = 5;

return n;
}

这里不需要返回引用
如你写的,函数调用结束后,函数栈会被销毁,引用不到了

例子:
函数返回值(int Func1())时,要产生一个临时变量作为函数返回值的副本(保存该函数调用中要返回的值),而用引用返回值(int &Func2())时,不产生值的副本。故在用函数返回值定义一个引用(int &ia = Func1())时,该引用为临时变量的引用,由于临时变量作用域短暂,故该引用存在随时无效的危险。而用引用返回值时,由于不产生值的副本,故int &i = func2();在func2()的返回值是一个静态或者全局变量的情况下的调用是合法可行的,其直接用全局数据区中的变量来初始化引用y,当然如果Func2中的返回值是局部变量,那么当然是非法的。

不妨自己再分析一下下面的四种函数调用:
int Func1();
int &Func2();
int &i = Func2();
int &ia = Func1();
int ib = Func1();
int ic = Func2();

c++返回引用的问题
第一个是保证了返回的类一定是存在的,否则有可能已经被析构了导致错误,第二个是提高了程序的效率,因为省去了复制的过程,这是因为函数返回后,系统产生一个匿名对象,并复制为返回的对象,之后你使用的都是这个匿名对象,

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

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

C++运算符重载,+-*\/的重载,返回值为什么是对象而不是对象的引用?而流操...
能返回引用,首先是因为out是作为参数传入的,不是函数的临时变量,函数结束时它仍然存在,这样就可以引用了。 再者,返回引用效率高,不用拷贝一个新的,直接返回它自己。 而且,返回引用有助于连着调用。比如cout<<a<<b<<c<<d,为什么可以连着写?其实<<也是函数,为什么我们平时的函数一般不能连着...

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

c++函数的返回值类型---引用&非引用
c++函数返回值类型:引用与非引用的区别在c++中,函数的返回值类型有明显区分,主要分为返回非引用类型和返回引用类型。两种方式在处理数据时有着显著的不同。1. 返回非引用类型 当你调用一个函数并期望函数返回一个新的对象或值时,它通常会返回非引用。这种方式下,函数创建了一个新的对象并将其值...

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

C++返回引用类型
& fun() { int a; a=10; return a; } 这样是不行的,因为a会在fun退出时被销毁,这时返回的a的引用是无效的。这种情况下,如果fun的返回类型不是int & 而是int就没有问题了。因此,要返回一个引用时,“临时变量”不能是“临时”的,至少得等函数外部使用完毕这个引用之后,才能销毁它。

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

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

相似回答
大家正在搜