函数返回值通常有(1)void类型(2)非引用类型(3)引用类型
对于前面两种是经常见到,也是容易理解的。
void princess(){//无返回值类型
//...
}
int count(const string & s) {//返回非引用类型
return s.size();
}
对于无返回类型就不用介绍了,返回非引用类型实际上是把return 后面的值,作为临时变量,对其复制一份返回就行(类似于值传递)。
当然也就不论它后面值是局部变量,还是全局变量或者其他的。
上面两种是大家都容易理解和常用的,但是对于第三个,函数返回引用类型,可能会有疑问。这个疑问可能主要来自于来自于C方面书籍上的一句话,“千万不要返回局部对象的引用”,当时课本的解释大概是,当函数在执行完毕后,会释放分配给局部对象的存储空间,对局部对象的引用就会指向不确定的内存。例如下面代码:
const string & copyl(const string &s) {
string sl = s;
return sl;
}//返回局部变量的引用
如果调用上述代码,程序会在运行的时候出现未知错误(当然,在编译时候不会出错)。既然返回局部变量的引用会出错,那谈何函数返回引用类型呢?
这里得提醒下大家,上面说的是“返回局部变量的引用会出错”,那如果返回的不是局部变量的引用呢,测试代码如下:
const string & copy(const string &s) {
return s;
}//返回参数的引用,即非局部变量的引用
上述代码运行是完全没有问题的。通过上述的具体测试后,大体总结下:
(1)函数返回非引用,实际就是将需要返回的值复制一份返回,无论需要返回的是局部变量还是全局变量
(2)函数千万不能返回局部变量的引用,因为在函数执行后,局部变量内存被计算机回收,局部变量的引用也就指向未知内存了
(3)函数返回引用时,可以是通过参数传递进来的(就是参数列表中有的变量),也可以是全局变量,切记不能是局部变量
(4)上述的引用可以换成指针,同样是成立的
PS:绝不要返回一个局部栈对象的指针或引用,绝不要返回一个被分配的堆对象的引用,如
果存在需要一个以上这样的对象的可能性时,绝不要返回一个局部 static 对象的指针或引
用。(FROM:Effective Cpp Item 21)注:如需转载,请注明出处!