这要从函数的调用过程分析,你应该知道,一个函数的参数如果不是引用的话,那么这个参数仅仅是一个值的拷贝,在函数体内对参数的任何操作不会影响这个参数的原值。对于函数的返回值,如果不是引用,那么只是暂时性的,举个例子,一个函数返回了一个int变量,那么当这个变量返回给外部使用后,这个变量的内存就立刻被系统回收了,也就是说这个值再也不存在了。
如果返回一个类的对象的话,建议还是把返回值写成引用的形式,这样做有两个好处,第一个是保证了返回的类一定是存在的,否则有可能已经被析构了导致错误,第二个是提高了程序的效率,因为省去了复制的过程,这是因为函数返回后,系统产生一个匿名对象,并复制为返回的对象,之后你使用的都是这个匿名对象,原先返回的对象早就不存在了,举个例子,这是函数申明:A f(void);,其中A是一个类,A有一个成员对象member,那么可以这么写:f().member,意思是调用f的返回值的member变量。其实你的返回值早就被析构了,你之所以可以这么用,是因为系统生成了一个匿名类对象,并复制成返回的那个类对象,所以你才可以这么用。有些复杂,不知道明白了没有,因为这个确实不是很好理解。
至于返回一个类的指针,那就更不对了,因为在函数中使用了对象都会被析构,所以这个返回的指针实际上是一个野指针,几乎注定要崩溃,除非你所指向的类对象是一个static静态属性的。
而引用就不一样了,引用告诉了计算机,你不必给我复制一个副本,直接给我把本人叫来,我要亲自操作它!系统知道有地方还要使用这个类对象,所以不会产生一个匿名类对象,而原先的返回值也不会被析构。
引用的唯一隐患就是安全性的问题,因为你是直接操作原始数据,所以一旦发生误操作,结果是无可避免的,这就是为什么用const来修饰引用的参数,这样保证了被引用的变量无法修改,同时提高了程序的运行效率
局部声明的“对象”在函数外面利用引用不存在。
既然是局部声明的,当然就是局部变量啦。
返回值就写string就行了。
你写的是重载+运算符,使它作为连接字符串运算符
-----------------下面是我改写的函数-------------------
String String::operator+(const String&c_string)
{
strcat(_string,c_string._string);
return (*this);
}
--------------------你去试下看看-----------------------
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!
函数返回整形的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();