一、引用作函数返回值
- 不要返回非静态局部变量的引用
- 函数返回的引用可以作为左值
对一个普通的、直接返回值的函数
int Square(int a ){ // 返回值
//int temp = a*a;
return a*a;
}
而返回引用是错误的,因为a是非静态局部变量,不能返回一个随时被销毁的局部变量的引用
int & Square(int a ){ //此处不能直接返回a的引用,因为a是局部变量,随时被销毁
//int temp = a*a; //但可以返回全局变量或静态变量
return a*a; //返回一个变量的引用相当于返回该变量本身,不会在内存中产生副本
}
但可以返回静态变量、全局变量。注意以下令 b = a,返回 b*b 是错误的,因为 b*b 也是局部变量
int & Square2(int a ){
static int b = a*a; //静态局部变量,保存在全局区,整个程序运行期间都不释放,保存上一次调用
return b; //时的值,即只赋初值一次;只能被该函数访问,在其他函数中不可见
}
int sqar = Square2(5); //sqar是b的引用
不能用值返回 直接作为 引用的初始化值,例如以下
int Square(int a){ // 值返回
return a;
int &s = Square(5);
但可以用返回的引用 作为 新一个引用的初始化值(当然,需要返回的是一个静态变量或全局变量),如以下
int b; //全局变量
int & Square2(int a ){
b = a*a;
return b;
}
int & sqar2 = Square2(6);
cout << sqar2 << endl;
函数的引用可以作为左值,相当于对
int b;
int & Square2(int a){ //此处返回的是b的引用,相当于b本身,故相当于对b赋值
b = a*a;
return b; //如果是值返回,则不能作为左值
}
int main() {
Square2(6) = 5;
cout << b <<endl;
}
二、引用作函数形参
此时形参也会修饰实参,类似指针
void Swap(int &a,int &b){
int temp = a; a = b; b = temp;
}
三、常量引用
本质是一个引用,加const防止被改,例如防止形参被改。引用只能引用在堆区或栈区的,不能是常量,如下会报错
int add(const int &a){
a++;
return a;
}