深入理解 C++ 中的引用:左值引用与右值引用

你是否在写函数参数时,纠结该用 int& 还是 int&&?🤔

你是不是也曾被左值右值引用&&这些名词搞得一头雾水?🤯

别担心,其实搞清楚它们比你想象的容易得多!

今天我们不谈复杂的移动语义、不聊完美转发,只专注一点:理解引用本身的本质与用法。🚀

什么是引用?🔁

引用就是给某个对象起个别名,让我们可以用另一个名字来操作它。

想象你把a这个变量也叫小A,你叫谁都能改那个变量的值。

引用的几个小特点:

  • 必须立即绑定对象,绑定后就不能换了 🪢
  • 不占独立内存,它只是别名,不是副本 📛
  • 使用上更简洁,不像指针要到处解引用 ✨

C++ 中有两种引用:

  • 👉 左值引用 T&:绑定持久存在、有名字的变量(左值)
  • 👉 右值引用 T&&:绑定临时的、没名字的值(右值)

对左值与右值傻傻分不清的小伙伴可以看下这篇~

左值引用(Lvalue Reference)🧲

左值引用是 C++ 的传统艺能,用得最多。

🎯 特点总结:

  • 只能绑定到左值(变量、数组元素等)
  • 可以通过引用修改原对象
  • 非常适合函数参数、返回值的引用传递

📌 例子:

int a = 10;
int& ref = a;
ref = 20;

💬 refa 的别名,改 ref 就是改 a

🧪 看下地址:

std::cout << "&a = " << &a << "\n";
std::cout << "&ref = " << &ref << "\n";

输出的地址是一样的,说明它们指向同一个东西:

&a   = 0x7ffeb3420e0c
&ref = 0x7ffeb3420e0c

右值引用(Rvalue Reference)⚡️

右值引用是 C++11 才引入的新能力,能绑定到临时对象。

它是进行资源优化(比如避免拷贝)的关键工具。

🎯 特点总结:

  • 只能绑定右值(临时的、没名字的东西)
  • 绑定后会延长临时对象的生命周期 ⏳
  • 常配合 std::move() 使用

📌 示例:

int&& rref = 10;
rref = 20;

std::cout << "rref = " << rref << "\n";
std::cout << "&rref = " << &rref << "\n";

🌟 虽然 10 是个右值,但通过右值引用 rref,我们接管了它,还能访问它的地址

这里说的访问,是通过右值引用间接访问,想要直接访问右值的地址是不行的

左值引用 vs 右值引用 📋

特性左值引用 T& 🧷右值引用 T&& 🔗
可绑定对象左值(有名对象)右值(临时值)
是否可修改
是否延长生命周期✅(绑定后延长)
应用场景参数传递、可修改返回临时对象处理、资源优化
能否绑定右值❌(除非 const)

注意事项⚠️

  • 引用一旦绑定,就不能再指向别的对象了 ❌

  • 右值引用变量本身是左值!(因为它有名字)

    int&& rref = 10;
    int& lref = rref;  // 合法,rref 是左值
    

🎯 小结

引用在 C++ 中是连接变量和内存世界的桥梁 🌉:

  • 左值引用帮我们操作已有变量

  • 右值引用帮我们接管临时对象

希望本文让你对引用有更加清晰的理解~😉
本文首发于微信公众号《Linux在秋名山》,欢迎大家关注~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux在秋名山

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值