C++的函数无法返回局部变量的引用,即,要么返回全局变量的引用,要么返回指针指向内容的引用。
1.对于一般函数
1)尽量避免返回引用类型,多使用引用传参
vector<T> func(const vector<T> &);
2)如果实在想返回作用域在函数内的变量的引用,可以利用指针实现(return给外部时相比非引用返回类型减少一次copy,速度较快,但不推荐)。
vector<T> &func(const vector<T> &v)
{
vector<T> *p;
vector<T> temp;
p = &temp; //指针指向局部变量的地址
//注意:上面三句话的顺序不能变
//如果想懒省事儿改成:
//vector<T> temp;
//vector<T> *p = &temp;
//c=func(a,b)接收的就是个空的vector<T>了
//赋值给c的前夕就被C++意外注销了
//惊不惊喜,意不意外,版本BUG
*p= vector<T>(...); //核心操作(返回的内容)
return *p;
}
上面的函数可以正常接收*p,但无法被套用。
vector<T> y = func(x); //正常, y=*temp
vector<T> y = func(func(x)); //异常
//func(x)作为引用传参时会提前清空自身, 实际传进的是非*p的垃圾数据(可自行验证)
2.对于类的函数
1)相比一般函数自由得多,因为类内的变量或者指针相对于类的函数都不是函数内的局部变量,因此建议多使用引用返回类型或者引用传参。
class A{
int x;
int *y;
public:
int &func1(const int &)
{
return x;
}
int &func2(const int &)
{
return *y;
}
int &func3(const int &)
{
return func2(func1(x));
}
};