从“&”开始的C++:告别指针的烦恼

一、什么是引用?

在C++中,引用就是给变量起的另一个名字。就像一个人可以有正式名和小名一样,变量也可以通过引用来拥有多个名字。这个特性是C++独有的,C语言中并没有真正的引用概念。

int main() {
    int price = 100;       // 原价
    int& discountPrice = price; // 折扣价(引用)
    
    discountPrice = 80;    // 通过引用修改
    cout << price;         // 输出80
}

二、引用的三大特性

  1. 起名时必须指定对象
    • 引用在创建时必须指定它代表哪个变量
    • 不能先声明后指定
int& ref; // 错误 必须立即指定代表谁
  1. 一生只认一个主
    • 引用一旦指定了代表的变量,就不能改代表其他变量
    • 对引用的赋值实际上是修改它代表的原变量
int a = 1, b = 2;
int& c = a;
c = b; // 这是把b的值赋给a,不是让c改随b
  1. 不能代表空值
    • 引用必须总是指向一个真实存在的变量
    • 比指针更安全,不会出现空引用的情况

三、为什么要用引用?

  1. 让函数修改实参
    • 传统C语言方式需要用指针
    • C++引用方式更直观安全
// C语言方式
void add(int* num) {
    (*num)++;
}

// C++引用方式
void add(int& num) {
    num++;
}
  1. 避免大对象拷贝
  • 传递大型对象时使用引用可以避免复制整个对象
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->权限缩小

总的来说,权限的越界带来的是不可预知的麻烦,所以在使用引用时,权限不能放大,只能缩小或平移,这样可以提高我们代码的安全性和健壮性。

五、使用建议

  1. 函数参数传递

    • 优先使用const引用传递大型对象
    • 需要修改实参时使用非const引用
  2. 返回值

    • 可以返回成员变量或静态变量的引用
    • 绝对不要返回局部变量的引用
  3. 与指针的选择

    • 需要重新绑定或表示可选值时用指针
    • 其他情况优先使用引用
  4. 权限的控制

    • 放大权限❌
    • 缩小、平移权限

六、常见误区

  1. 认为引用占用额外内存

    • 引用通常由编译器实现为指针,但不占用显式内存
    • sizeof(引用)返回的是原变量的大小
  2. 试图获取引用的地址

    • &ref得到的是原变量的地址
    • 引用本身没有独立地址
  3. 混淆引用和指针

    • 引用必须初始化,指针可以不初始化
    • 引用不能为空,指针可以为nullptr
    • 引用不能改变绑定,指针可以改变指向

七、总结

C++引用是一个强大而安全的特性:

  • 让代码更直观易读
  • 避免不必要的对象拷贝
  • 比指针更安全可靠
  • 是实现操作符重载等重要特性的基础

合理使用引用可以让你的C++代码更加专业和高效。记住引用的核心特点,避免常见错误,你就能充分发挥它的优势。

感谢您的阅读和关注! (˶╹ꇴ╹˶)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值