一、引用
1.什么是引用
引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名。
2.定义的格式
类型&引用变量名=已定义过的变量名。
3.引用的特点
1)一个变量可以取多个别名。
2)引用必须初始化。
3)引用只能在初始化的时候引用一次,不能改变为再引用其他的变量。
int main()
{
int a = 1;
int& b = a;
int& c = a;
int& d = c;
cout<<a<<endl;
cout<<b<<endl;
cout<<c<<endl;
cout<<d<<endl;
return 0;
}
二、const引用
用一个函数来表示常引用与引用的区别:
int main()
{
int d1 = 4;
const int& d2 = d1;
d1 = 5; //d1的改变d2的值也会随之改变
//d2 = 6; //不能给常量(不能被修改的量)赋值
const int d3 = 1;
const int& d4 = d3;
//int& d5 = d3;
const int& d6 = 5;//常量具有常性,只有常引用可以引用常量
double d7 = 1.1;
//int& d8 = d7; //d7是double类型,d8是int,d7赋值给d8时要生成一个临时变量
//也就是说d8引用的是这个带有常性的临时变量,所以不能赋值。
const int& d9 = d7;
}
三、引用做返回值和引用传参
如果形参为引用类型,则形参是实参的别名。
void Change(int& a, int& b)
{
int tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 1;
int b = 2;
Change(a,b);
cout<<"a="<<a<<" "<<"b="<<b<<endl;
return 0;
}
在上面的例子中,我们进行传参的时候没有使用指针,但是运行出来之后的结果依旧是正确的。
引用做返回值:
int& Add(int n, int m)
{
int sum = n+m;
return sum;
}
int main()
{
int a = 1;
int b = 2;
int ret =Add(a, b);
cout<<"ret = "<<ret<<endl;
return 0;
}
上面这个引用做返回值虽然给过是正确的,但是编译器会给出一个warning:
原因是传值返回时,是将sum的值放到eax寄存器中。传引用返回时,是取ret的地址放到eax寄存器中。
所以:
1)不要返回一个临时变量的引用。
2)如果返回对象出了当前函数的作用域依旧存在,则最好使用引用返回,因为这样更高效。
四、指针和引用的区别和联系
1)引用只能在定义时初始化一次,之后不能改变指向其他变量(从一而终);指针变量的值可变。
2)引用必须指向有效的变量,指针可以为空。
3)sizeof指针对象和引用对象的意义不一样。Sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。
4)指针和引用自增(++)自减)(--)意义不一样。
5)相对而言,引用比指针更安全。
总结:指针比引用更灵活,但是也更危险。使用指针时一定要注意检查指针是否为空。指针所指的地址释放后最好置0,否则可能存在野指针的问题。