1、什么是引用
给已知的变量去一个别名,内存不会再为该引用分配新的内存空间,节省内存空间!!!
2、定义语法
数据类型 &引用名 = 引用的变量名;
例子:
int a=100;
//对变量a 取一个别名
int &q=a; // a 与 q 是完全等价的!!
3、使用场合
一般都是用来作为参数传递,让函数直接访问数据的本身,节省临时空间的产生!!
4、常量引用
4.1、作用
- 防止引用名去修改原理啊数据的值;
- 对数据常量进行引用
4.2、语法
const 数据类型 &引用名=引用的对象;
例子:
int a=10086;
//定义常量引用
const int &p=a; //特点:别名 p 无法修改 a 的值
//对一个常量进行引用
const int &q=1000;
4.3、引用作为函数的参数
引用作为函数的参数,用户不需要修改该数据时,那么我们就可以传递常量引用
例子:
//常量引用作为函数参数的特性
int add(const int &a,const int &b)
{
return a+b; //并未修改 ab 的数据,只是访问
}
int main()
{
int a=10,b=20;
cout << add(a,b) << endl; //可以传递变量
cout << add(100,200) << endl; //也可以传递常量
}
4.4、常量引用的特殊写法
数据类型 &&引用名;
int &&a=100; //常量引用
这种写法只能引用常量, 不能引用变量!!
5、引用作为函数的返回值
注意!!!!当引用作为返回值时,必须要保证函数结束后该空间还是存在的!!
引用作为返回值时一般返回:静态变量,全局变量,堆空间,(传递的参数引用)… (不会被释放空间)
当一个引用作为返回时,该函数可以作为左值
例子:
//返回一个引用 , a 的本身
int &re_yy()
{
static int a=200;
return a;
}
//re_yy() 作为右值
int b = re_yy(); //理解 b = a;
//re_yy() 作为左值
re_yy() = 300; //理解 a = 300; 成立!!
6、经典例子
#include <iostream>
using namespace std;
/*
int &re()
{
//定义一个局部变量a
int a = 10086;
//返回a的本身
return a; //局部变量a 的数据已经被释放了!! 所以不能返回!
}*/
//全局变量a
int a = 10010;
int &re1()
{
//修改为静态变量, 存储在数据段中
//static int a=10010;
return a;
}
int main()
{
//返回静态变量a 的引用
cout << re1() << endl; //10010
int &p = re1(); //为静态变量a 取一个别名 p
p = 10086; //通过别名 去修改 a 的值 (p就是a ,a就是p)
cout << p << endl; //10086
//输出的是多少???
cout << re1() << endl; //10086 ->因为p已经修改静态变量a 的值!!
//静态变量只能被初始化 1 次
}
7、注意事项
- 引用必须要初始化 (因为引用就是取别名,取别名的对象都没有,哪里来的别名?)
- 引用一个常量时,需要使用 const 常量引用 或者 && 右值引用
- 引用的类型必须要匹配
引用的类型匹配图://定义一个空引用是错误的 int& a; //初始化 == 取别名 int &a = 100; //引用一个常量, 没const是错误的 int &&b = 200; //引用一个常量,正确 int a = 100; int& b = a; // 正确 int c = 200; b = c; //正确,更改b的值,并不是更改b的引用对象,引用只能初始 // 化一次,后面的只是赋值 char& c = a; //错误,初始化引用时类型必须匹配