一、什么是引用?
在C++中,引用就是给变量起的另一个名字。就像一个人可以有正式名和小名一样,变量也可以通过引用来拥有多个名字。这个特性是C++独有的,C语言中并没有真正的引用概念。
int main() {
int price = 100; // 原价
int& discountPrice = price; // 折扣价(引用)
discountPrice = 80; // 通过引用修改
cout << price; // 输出80
}
二、引用的三大特性
- 起名时必须指定对象
- 引用在创建时必须指定它代表哪个变量
- 不能先声明后指定
int& ref; // 错误 必须立即指定代表谁
- 一生只认一个主
- 引用一旦指定了代表的变量,就不能改代表其他变量
- 对引用的赋值实际上是修改它代表的原变量
int a = 1, b = 2;
int& c = a;
c = b; // 这是把b的值赋给a,不是让c改随b
- 不能代表空值
- 引用必须总是指向一个真实存在的变量
- 比指针更安全,不会出现空引用的情况
三、为什么要用引用?
- 让函数修改实参
- 传统C语言方式需要用指针
- C++引用方式更直观安全
// C语言方式
void add(int* num) {
(*num)++;
}
// C++引用方式
void add(int& num) {
num++;
}
- 避免大对象拷贝
- 传递大型对象时使用引用可以避免复制整个对象
void print(int (&a)[100000])
{
...
}
四、引用的权限控制
- 权限的放大(禁止)
const int a;
int& b=a;//非const引用const->权限放大
- 权限的平移
int a;
int& b=a;//非const 引用非const->权限平移
const int c;
const int& d=c;//const引用const->权限平移
- 权限的缩小
int a;
const int& b=a;//const引用非const->权限缩小
总的来说,权限的越界带来的是不可预知的麻烦,所以在使用引用时,权限不能放大,只能缩小或平移,这样可以提高我们代码的安全性和健壮性。
五、使用建议
-
函数参数传递
- 优先使用const引用传递大型对象
- 需要修改实参时使用非const引用
-
返回值
- 可以返回成员变量或静态变量的引用
- 绝对不要返回局部变量的引用
-
与指针的选择
- 需要重新绑定或表示可选值时用指针
- 其他情况优先使用引用
-
权限的控制
- 放大权限❌
- 缩小、平移权限 ✔
六、常见误区
-
认为引用占用额外内存
- 引用通常由编译器实现为指针,但不占用显式内存
- sizeof(引用)返回的是原变量的大小
-
试图获取引用的地址
- &ref得到的是原变量的地址
- 引用本身没有独立地址
-
混淆引用和指针
- 引用必须初始化,指针可以不初始化
- 引用不能为空,指针可以为nullptr
- 引用不能改变绑定,指针可以改变指向
七、总结
C++引用是一个强大而安全的特性:
- 让代码更直观易读
- 避免不必要的对象拷贝
- 比指针更安全可靠
- 是实现操作符重载等重要特性的基础
合理使用引用可以让你的C++代码更加专业和高效。记住引用的核心特点,避免常见错误,你就能充分发挥它的优势。
感谢您的阅读和关注! (˶╹ꇴ╹˶)