目录
引用
引用:引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
类型& 引用变量名(对象名) = 引用实体;
void Test_file() {
int a = 10;
int& ra = a;
printf("%p\n", &ra);
printf("%p\n", &a);
}
注意:引用类型必须和引用实体是同种类型的
引用特性
1. 引用在定义时必须初始化
2. 一个变量可以有多个引用
3. 引用一旦引用一个实体,再不能引用其他实体
void Test_file2() {
int a = 10;
int& ra = a;
const int& rra = a;
const int& rrra = ra;
}
![](https://i-blog.csdnimg.cn/blog_migrate/c94e747e83b7a312f8f294d95f477138.png)
常见错误
void TestConstRef()
{
const int a = 10;
//int& ra = a; // 该语句编译时会出错,a为常量
const int& ra = a;
// int& b = 10; // 该语句编译时会出错,b为常量
const int& b = 10;
double d = 12.34;
//int& rd = d; // 该语句编译时会出错,类型不同
const int& rd = d; }
引用的使用场景
1. 做参数
void Swap ( int & left , int & right)
2.
做返回值
int & Count ()
注意:
如果函数返回时,出了函数作用域,如果返回对象还未还给系统,则可以使用引用返回,如果已
经还给系统了,则必须使用传值返回。
传值、传引用效率比较
以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是
传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是
当参数或者返回值类型非常大时,效率就更低。
传值和指针在作为传参以及返回值类型上效率相差很大
。
![](https://i-blog.csdnimg.cn/blog_migrate/40904edc3f12986f9dbccc9fb79accce.png)
引用和指针的区别
在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。
在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。
![](https://i-blog.csdnimg.cn/blog_migrate/cc618e4e52af505aaafdda3d2d8a71f5.png)