1.引用的概念及用法
引用:将一个已有变量再起一个别名
格式为 类型 &别名=已定义过的变量
特点:<1>一个变量可以取多个别名
<2>引用必须初始化
<3>引用只能再初始化的时候被引用一次,不能再更改。
例
void test1()
{
int a = 5;
int &b = a;
cout << a << endl; //结果为5
cout << b << endl; //结果为5
}
void test2()
{
int d1 = 4;
const int& d2 = d1; //d2是d1的别名 d2用const修饰 因为d1是可读可写的 const修饰d2后 d2为只读 范围由大变小 所以可以进行引用
cout << d1 << " "<< d2 << endl; //输出d1 d2 结果为4 4
d1 = 5;
cout << d1 << " " << d2 << endl; //更改d1后输出d1 d2 结果为5 5
}
2.引用做参数
类似于交换函数
swap(int a ,int b)
在C语言阶段我们常常会将swap函数传值时将变量地址传过去,原因在这就不多解释了
C++还可以通过引用的方式将两个数交换
例
void swap1(int& a, int& b)
{
int tmp = a;
a = b;
b = tmp;
}
在值传递的过程中 函数会在传值形成形参时进行一次拷贝构造 然后在函数结束时将返回值再拷贝构造成一个中间变量 栈帧销毁 函数中变量全部销毁
值传递进行了两次拷贝构造 1次析构(栈帧销毁的过程)
而引用传递则是再形成形参时进行一次构造 一次析构完成
所以对比以上结果 发现值传递效率很低 而引用转递则会更高效
3.引用做返回值
例:
int& Add(int d1, int d2)
{
int ret = d1 + d2;
return ret;
}
4.汇编层看引用的特性
<1>不要返回一个临时变量的引用
<2>如果返回对象出了当前函数的作用域依旧存在、则最好使用引用返回,因为更高效
5.引用和指针的区别
<1>引用只能在定义时初始化一次,之后不能改变指向其他变量,指针变量的值可以改变
<2>引用必须指向有效的变量,指针可以为空
<3>sizeof指针对象和引用对象的意义不一样,sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小
<4>指针和引用自增(++)自减(--)意义不一样
<5>相对而言,引用比指针更安全