左值引用
1、格式:类型 &引用名=变量名;
2、例如:
int i=9;
int &ir=i;//ir为i的别名,ir和i的值始终保持相同;
ir=20;//i=20;
i=10;//ir=10;
//其中ir和i为一体的,两个值始终相同。
- 1
- 2
- 3
- 4
- 5
3、注意必须在定义时初始化,不能在定义完成后再给它赋值
例:
int &i;//错误,因为没有在定义时初始化;
int &i=h;//正确;
- 1
- 2
4、引用只能引用变量,不能引用常量和表达式。
引用有两种方法,包括参数传递和参数返回值
一、参数传递
1、参数传递有三种方式
(1)传值
(2)传地址
(3)传引用
注意,其中(2)与(3)的效果相同,但是传引用更加简单
值传递
无法交换两数值的代码
#include <iostream>
using namespace std;
void swap(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
}
int main()
{
int x=10;
int y=5;
swap(x,y);
cout<<x<<" "<<y<<endl;
return 0;
}
//不管是c语言还是c++中都不能用此种方法交换两数值
#include <stdio.h>
#include <stdlib.h>
void swap(int i,int j)
{
int temp;
temp=i;
i=j;
j=temp;
}
int main()
{
int i,j;
i=3,j=4;
swap(i,j);
printf("%d %d",i,j);
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
指针传递
#include <iostream>
using namespace std;
void swap(int *a,int *b)//这里是*
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
int main()
{
int x=10;
int y=5;
swap(&x,&y);//c++中把实参x的地址复制到形参a,将y的地址复制到形参b;//这里是&
cout<<x<<" "<<y<<endl;
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
引用参数
#include <iostream>
using namespace std;
void swap(int &a,int &b)//这里是&
{
int temp;
temp=a;
a=b;
b=temp;
}
int main()
{
int x=10;
int y=5;
swap(x,y);//a是实参x的引用,b是实参y的引用;//这里什么也没有
cout<<x<<" "<<y<<endl;
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
二、函数返回值
1、原型:返回类型 &函数名称(类型 变量名,类型 变量名,类型 变量名,等等)
2、当一个函数返回引用时,实际返回了一个变量的内存地址
例如:
int &g(int i,int j)
{return i+j;//错误,因为只能返回一个变量;}
但是
const int &g(int i,int j)
{return i+j;//正确,因为相当于int temp=i+j;
// return temp;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
3、当一个函数返回引用时,实际返回了一个变量的内存地址
int &g(int i,int j)
{
int temp;
temp=i+j;
return temp;
}
- 1
- 2
- 3
- 4
- 5
- 6
#include <iostream>
using namespace std;
int temp;//全局变量若未赋值,则初值为0;
int f1()
{
return temp;
}
int *f2()//指针函数,返回的应为指针;
{
return &temp;//地址与指针相对应;
}
int &f3()//返回值是引用函数;
{
return temp;//返回的temp的引用(无名);
}
int main()
{
int y=1;
int x;
x=f1();//正确,右值;
f1()=y;//错误,左值;
*f2()=y;//正确,相当于temp=y,其实是改变了temp的值;
f3()=y;//正确,相当于temp=y,左值是temp的引用;
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
注意
一般在定义函数的时候,例如int get(int &a,int &b,int c,int d);
这里面加&号是因为要在自己定义的函数里面改变*a与b的数值*,但是c与d前面没有&号,说明在定义的函数里面没有改变其数值,只是调用了其数值。//也就是说当在一个函数里面改变某一个变量的值的时候要加&号,如果没有改变的话就不用加&号。
例如:
void max_min(int &mmax,int &mmin,int a,int b,int c)
{
mmax=max(a,b);
mmax=max(mmax,c);
mmin=min(a,b);
mmin=min(mmin,c);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
与
void max_min(int &mmax,int &mmin,int &a,int &b,int &c)
{
mmax=max(a,b);
mmax=max(mmax,c);
mmin=min(a,b);
mmin=min(mmin,c);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
等同,因为在这个调用函数中,a,b,c的值没有改变,mmax,mmin的值改变了,没有改变的值前面不用加&号,但是要改变的值前面要加&号。