引用
基本语法
作用:给变量起别名
语法:数据类型 &别名 = 原名
注意事项
1.引用必须初始化
2.引用初始化后,不可改变 (形如 int &b = a;)
int a = 10 ;
int &b = a ;
int c = 20 ;
b = c ;
输出结果: a=20,b=20,c=20
引用做函数参数
作用:函数传参时,可利用引用让形参修饰实参(个人理解就是,形参改变实参跟着改变)
可简化指针修改实参
void switch (int &a , int &b)
{
int temp = a ;
a = b ;
b = temp ;
}
int main ()
{
int a = 10 ;
int b = 20 ;
}
//上面的&a是实参a的别名,修改&a相当于修改地址值
引用做函数的返回值
作用:引用可以作为函数的返回值
注意事项:不要返回局部变量引用
int& test ()
{
int a = 10 ;
return a ;
}
int main ()
{
int &ref = test() ;
cout << "ref=" << ref << ednl; //第一次输出ref=10,是因为编译器保留数据
cout << "ref=" << ref << ednl; //第二次结果错误,内存已经释放
}
局部变量存放在栈区,操作过后即释放。
用法:函数调为左值
int& test01()
{
static int a = 10 ;
return a ;
}
int main()
{
int &ref = test01();
test01() = 10000;
}
引用的本质
本质:在C++内部实现是一个指针常量
引用的本质是操作指针,只是所有的指针操作编译器已经搞定了
常量引用
作用:用于修饰形参,防止误操作 形参(函数定义时那个()里面的)
常量引用用于确保函数内部无法通过该引用修改传入的参数,从而避免代码层面的误操作。但这不意味着原变量在函数外不能被其他方式修改(若原变量本身是非常量)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
C++ 引用详解
一、基本概念
-
作用:给变量起别名
-
语法:
数据类型 &别名 = 原名
int a = 10; int &b = a; // b是a的别名
二、注意事项
-
必须初始化
int &b; // 错误 int &b = a; // 正确
-
初始化后不可改变指向
int a = 10, c = 20; int &b = a; b = c; // 等同于 a = c(赋值操作,不是改变引用指向) cout << a; // 输出20
三、引用做函数参数
-
作用:实现形参修饰实参(类似指针效果)
void swap(int &a, int &b) { int temp = a; a = b; b = temp; } int main() { int x=10, y=20; swap(x, y); // x=20, y=10 }
四、引用做函数返回值
1. 禁止返回局部变量引用
int& test() { int a = 10; // 栈区变量 return a; // 危险操作! } int main() { int &ref = test(); cout << ref; // 第一次可能输出10(残留数据) cout << ref; // 内存释放后输出异常 }
2. 正确用法(返回静态变量/全局变量)
int& test() { static int a = 10; // 静态区变量 return a; } int main() { int &ref = test(); test() = 1000; // 函数调用作为左值 cout << ref; // 输出1000 }
五、引用的本质
-
底层实现:指针常量(
Type* const
) -
编译器行为:
int &b = a; // 自动转换为:int* const b = &a; b = 100; // 自动转换为:*b = 100;
六、引用 vs 指针
特性 | 引用 | 指针 |
---|---|---|
空值 | 不允许 | 允许NULL |
指向修改 | 不可修改 | 可以修改 |
内存占用 | 无额外空间 | 占用存储空间 |
访问方式 | 自动解引用 | 显式解引用 |
建议:函数参数传递和返回值优先使用引用,需要"无物"表示时使用指针(如NULL场景)