(1)千万不要返回局部对象的引用
当函数执行完毕时,将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。考虑下面的程序:
// Disaster: Function returns a reference to a local object
const string &manip(const string& s)
{
string ret = s;
// transform ret in some way
return ret; // Wrong: Returning reference to a local object!
}
这个函数会在运行时出错, 因为它返回了局部对象的引用。 当函数执行完毕,字符串 ret 占用的储存空间被释放,函数返回值指向了对于这个程序来说,不再有效的内存空间。
(2)千万不要返回局部对象的指针
函数的返回类型可以是大多数类型。特别地,函数也可以返回指针类型。和返回局部对象的引用一样, 返回指向局部对象的指针也是错误的。 一旦函数结束,局部对象被释放, 返回的指针就变成了指向不再存在的对象的悬垂指针。
(3)引用返回左值
返回引用的函数返回一个左值。因此,这样的函数可用于任何要求使用左值的地方:
测试代码如下:
#include <iostream>
#include <string>
using namespace std;
char &get_val(string &str, string::size_type ix)
{
return str[ix];
}
int main()
{
string s("a value");
cout << s << endl; // prints a value
get_val(s, 0) = 'A'; // changes s[0] to A
cout << s << endl; // prints A value
return 0;
}
输出结果:
tekken@tekken:~/C++WS$ ./a.out
a value
A value
网友评论