一、概念
引用:不是一个新定义的变量,而是一个已经定义好的变量的别名
格式:类型 &引用变量名=已定义过的变量名
特点:
(1)一个变量可以有多个别名
(2)引用必须初始化(引用必须是其他变量的别名)
(3)引用只能在初始化的时候引用一次,不能改变为其他变量的引用
二、const引用(常引用)
三、引用做参数
1、【值传递】如果形参为非引用的传值方式,则生成局部临时变量接收实参的值
void Swap1(int x, int y)
{
int tmp = x;
x = y;
y = tmp;
}
不会交换两个变量的值
原因:函数内部的值确实已经交换,但不会影响外面的值
2、【引用传递】如果形参为引用类型,则形参是实参的别名
void Swap2(int &x, int &y)
{
int tmp = x;
x = y;
y = tmp;
}
3、【指针传递】
void Swap3(int* x, int* y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
4、当不希望改变函数内部改变参数x的值,尽量使用const引用传递
void read(const int & x)
{
//...
}
四、引用做返回值
1、【传值返回】
int Add(int x, int y)
{
return x + y;
}
2、【传引用返回】
int &Add(int x, int y)
{
int ret= x + y;
return ret;
}
3、利用汇编看传值返回和传引用返回
结论:
1、不要返回一个临时变量的引用
2、如果返回对象出了当前函数的作用域依旧存在,最好使用传引用返回(因为传引用高效)
五、引用和指针的区别和联系
1、引用只能在定义时初始化,之后不能改变指向其它变量(从一而终);指针变量的值可以改变
2、引用必须指向有效的变量;指针可以为空
3、sizeof引用得到的是所指向的变量的大小;sizeof指针是对象地址的大小
sizeof(char*)
在32位平台上为4
在64位平台上看编译器配置创建工程时决定是4还是8
4、指针和引用自增(++)自减(--)意义不一样
引用自增自减改变变量的内容
指针自增自减改变指针指向
5、有多级指针,没有多级引用
6、相对而言,引用比指针更安全(指针比引用更灵活)
7、注意野指针的问题