引用
引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名;
格式: 类型& 引用变量名 = 已定义过的变量名;
引用的特点
1.引用必须初始化;
int a;
int& b = a;//正确
int& c;//错误,没有初始化
2.引用声明完后,不能再把该引用名作为其他变量的别名;
int a;
int b;
int& c = a;
int& c = b;//错误
3.一个变量可取多个别名;
int a;
int& b = a;
int& c = a;//b和c都为a的别名
4.声明一个引用,表示引用名只是该变量的一个别名,它本身不是一个变量,因而不占用内存;
5.不能建立引用的数组(数组元素为引用),但可以建立数组的引用(对数组名的引用);
由于引用不占内存,所以不能为数组元素
建立数组的引用:
int a[3] = {1,2,3};
int& (&b)[3] = a;//对数组的引用
const引用
int a1 = 3;
const int& a2 = a1;
a1 = 4; //a1的值改变a2的值也会变
//a2 = 5; //不能给常量赋值
const int b1 = 2;
//int& b2 = b1; //错误,类型不同
const int& b3 = b1;//正确
const int& b4 = 1; //正确,常量具有常性,只有常引用可以引用常量
double c1 = 7.35;
//int& c2 = c1; //c1是double类型,c2是int类型,c1赋值给c2时生成一个临时变量
//c2引用的其实是这个带有常性的临时变量,所以不能引用
const int& c3 = c1;//正确
引用作为参数
void Swap(int& x, int& y)//形参是引用类型,则形参是实参的别名
{
char tmp = x;
x = y;
y = tmp;
}
常引用传参
void func(const int& a)//当不希望改变参数的值,尽量使用常引用传参
{
b = a;
}
传值做返回值,传引用做返回值
int& func(int& a)//传引用做返回值
{
b = a;
return a;
}
注意:
1.不要返回一个临时变量的引用;
2.如果返回对象出了当前函数的作用域依旧存在,则最好使用引用返回,因为更高效;
引用和指针的联系和区别
- 引用只能在定义时初始化一次,之后不能改变指向其他变量,而指针的值可以改变;
- 引用必须指向有效的变量,而指针可以为空;
- sizeof(引用对象)和sizeof(指针对象)的意义不同,sizeof(引用对象)指的是引用对象的大小,sizeof(指针对象)指的是指针对象的地址大小;
- 引用和指针的++和--不一样;
- 引用相对于指针更安全;