引用
概念:引用不是定义一个新的变量。而是给一个已经定义的变量起一个别名。因为引用不需要额外开辟空间。
用法:类型 &引用变量名=已定义过的变量名
void TestReference2 ()
{
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;
}
引用的特点:
- 一个变量可取多个别名
- 引用必须初始化
- 引用只能在初始化的时候引用一次,不能改变为再引用其他的变量。
引用做参数
1.如果形参为引用类型,则形参是实参的别名。
void Swap (int& left, int& right)
{
int temp = left;
right = left ;
left = temp ;
}
2.当不希望函数内改变参数的值,尽量使用常引用传参。
引用做返回值
1. 不要返回一个临时变量的引用。因为临时变量在函数返回后被释放,给这个临时变量起别名没有任何意义,而引用的底层原理为指针,很容易产生野指针。
2. 如果返回对象出了当前函数的作用域依旧存在,则最好使用引用返回,因为这样更高效。
汇编层看引用的特性
引用和指针的区别
- 引用只能在定义时初始化一次,之后不能改变指向其他变量;指针变量的值可变。
- 引用必须只想有效的变量,指针可以为空。
- sizeof指针对象和引用对象的意义不一样,sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。
- 指针和引用的自增(++)自减(--)意义不一样。指针++加的是数据的类型大小。
- 引用比指针更安全。