文章目录
一、引用
1、概念
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。这就像小时候家里给起的小名,例如:小明,这与大名指的是同一个实体,共用一个空间。
类型& 引用变量名(对象名) = 引用实体;
void TestRef()
{
int a = 10;
int& ra = a;//<====定义引用类型
printf("%p\n", &a);
printf("%p\n", &ra);
}
注意:引用类型必须和引用实体是同种类型
2、特性
- 引用在定义时必须初始化。
- 一个变量可以有多个引用。
- 引用一旦引用一个实体,就不能引用其他实体。
void TestRef()
{
int a = 10;
// int& ra; //没有初始化,所以编译器会报错
int& ra = a;
int& rra = a;//与ra引用的是同一个实体
printf("%p %p %p\n", &a, &ra, &rra);
}
3、常引用
目的:不想通过引用来改变原来空间的值
形式: const int &c = a //相当于 const int * const c = &a
常引用初始化有两种情况:
- 用变量 初始化常引用
int e = 30;
const int &f = e;//用e变量去初始化 常引用
- 用字面量 去初始化 常量引用,不能用常量给引用赋值
const int g = 40;
//int &rg=g; 报错哦!
const & rg=g;可以哦!
//int &m = 41;//普通引用 引用一个字面量 字面量中没有内存地址 不可以哦
const int &m = 43;//c++编译器会分配内存空间 给&m
cout <<"m="<<m << endl; //输出为43
4、使用场景
- 做函数的参数
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
- 做函数的返回值
int& TestRefReturn(int& a)
{
a += 10;
return a;
}
如果函数返回时,离开函数作用域后,其栈上空间已经还给系统,因此不能用栈上的空间作为引用类型返回。如果以引用类型返回,返回值的生命周期必须不受函数的限制(即比函数生命周期长)。像下面这个例子就会出问题:
int& Add(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int& ret = Add(1, 2);//用的栈上的空间进行返回,函数结束时就会返还栈上的空间。
Add(3