一、引用的概念
引用不是新定义一个变量,而是给已有变量取一个别名,编译器不会为引用变量开辟内存空间,而和它引用的变量共用一块内存空间。
注意,由于C++兼容C,所以&既可以是引用符号,也可以是取地址
int a = 0;
int& b = a;
cout << &a << endl;//0000009D826FF524
cout << &b << endl;//0000009D826FF524
补充:
1.同一个变量可以有多个别名
2.可以对变量的别名再取别名
3.引用必须初始化
4.引用不能该别指向
二、引用的基本使用场景
1.做函数参数
void swap(int& a, int& b)
{
int tmp = a;
a = b;
b = tmp;
}
int main()
{
int x = 10;
int y = 20;
swap(x, y);//函数接收到x与y后,相当于为x与y分别取别名为a和b
cout << "x=" << x << " " << "y=" << y << endl;
return 0;
}
2.做函数返回值
注意:不能返回局部变量(临时变量)的引用,否则可能会出现野引用
局部变量a在func函数执行完毕后即被销毁,主函数中用引用变量ret接收变量a,因此ret为野引用
int& func()
{
int a = 10;
return a;
}
int main()
{
int& ret = func();//ret即为野引用
return 0;
}
正确做法:返回静态变量,诸如此类的非临时变量的引用
int& func()
{
static int a = 10;
return a;
}
int main()
{
int& ret = func();
return 0;
}
三、引用和指针的区别
语法方面:
1.引用是取别名,无需开空间;指针是地址,需要开空间
2.引用必须初始化;指针可以初始化,也可以不初始化
3.引用不可以改变指向;指针可以改变指向
4.引用相对较安全,没有空引用,不易出现野引用;指针容易出现空指针和野引用
5.sizeof(引用)结果是引用指变量的大小;sizeof(指针)结果是4/8字节
底层实现方面:
汇编层面上,不存在引用,引用就是使用指针实现的,引用编译后也就成了指针
引用的本质是指针常量:int& b=a 即为 int* const b=&a
四、常量引用
1.常量引用,引用变量不可修改,即a不可再修改
void func(const int& a)
{
cout << a << endl;
}
2.普通引用只能指向变量,常量引用可以指向常量,编译器会临时创建一个变量文章来源:https://www.toymoban.com/news/detail-823118.html
const int &ret=10;//正确,const修饰后,编译器会临时创建一个变量
//int tmp=10;
//int &ret=tmp;
3.引用作为函数参数时,常量引用和普通引用是不一样的,可以构成重载函数文章来源地址https://www.toymoban.com/news/detail-823118.html
void func(int &a)
{
cout<<"func(int &a)的调用"<<endl;
}
void func(const int &a)
{
cout<<"func(const int &a)的调用"<<endl;
}
int main(int argc, char** argv) {
int m;
func(m);//调用func(int &a)
func(3);//调用func(const int &a)
}
到了这里,关于C++中的引用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!