当前位置: 首页 > wzjs >正文

网站设计公司 无锡网站搭建官网

网站设计公司 无锡,网站搭建官网,厦门市建设局新网站,渭南自建站网站建设C 左值与右值全面讲解 一、什么是左值(Lvalue)与右值(Rvalue) 项目左值(Lvalue)右值(Rvalue)是否有名字✅ 有,具名变量❌ 无名,通常是表达式/字面值是否可取…

C++ 左值与右值全面讲解


一、什么是左值(Lvalue)与右值(Rvalue)

项目左值(Lvalue)右值(Rvalue)
是否有名字✅ 有,具名变量❌ 无名,通常是表达式/字面值
是否可取地址✅ 可以 &a❌ 不能 &(a + b)
生命周期通常在作用域内持续临时值,表达式计算后可能立即销毁
是否能赋值✅ 可以放在赋值号左边❌ 不可以出现在赋值号左边
举例int a;, a = 5;, int& r = a;10, a + b, getTemp()(非引用返回)

二、左值与右值基础示例

int a = 5;       // a 是左值
int b = a + 3;   // a + 3 是右值(表达式结果)

理解:

  • a 是具名变量,有内存地址,可被赋值;
  • a + 3 是右值,只存在于表达式计算期间。

三、引用绑定规则示例

int a = 10;
int& ref = a;          // ✅ 左值引用,绑定 a
ref = 15;              // ✅ 修改了 a 的值int& ref2 = 10;        // ❌ 错误!右值不能用普通引用绑定
const int& cref = 10;  // ✅ 合法!const 引用可绑定右值

结论:

  • 右值可以用 const T& 绑定;
  • 不能用普通 T& 来绑定右值;
  • const T& 会延长右值生命周期。

四、右值引用(C++11)

右值引用的语法:

int&& rref = 5;       // 右值引用
rref = 10;            // ✅ 修改右值绑定的变量

应用:用于移动语义,替代深拷贝,提高性能。


五、函数参数中的左值引用与右值引用重载

void print(string& s)      { cout << "左值引用: " << s << endl; }
void print(string&& s)     { cout << "右值引用: " << s << endl; }int main() {string a = "Hello";print(a);                  // 左值引用print(string("World"));    // 右值引用print(a + "!");            // 右值引用(临时表达式)
}

输出:

左值引用: Hello
右值引用: World
右值引用: Hello!

六、函数返回值与左值右值

int& getA() {static int a = 10;return a;
}int getB() {return 20;
}int main() {getA() = 30;    // ✅ 合法,getA() 是左值引用getB() = 40;    // ❌ 错误,getB() 是右值(返回值拷贝)
}

原则:

  • 返回 引用(左值) 可以继续赋值;
  • 返回 值(右值) 不能被赋值。

七、引用折叠(C++11)

用于模板中区分左值右值:

template<typename T>
void func(T&& arg);func(a);      // T = int&,T&& = int&(折叠为左值引用)
func(10);     // T = int,T&& = int&&(右值引用)

折叠规则口诀:

  • & &&
  • & &&&
  • && &&
  • && &&&&

八、const 修饰的指针/引用绑定

1. 右值绑定常量引用

const int& r = 100;   // OK,右值可以用 const 左值引用绑定

2. 左值引用右值

int& r = 100;         // ❌ 错误

九、右值引用与移动构造函数

class MyString {string data;
public:MyString(string&& s) : data(std::move(s)) {}
};

std::move(s) 将右值传递到 data,避免了复制构造。


十、配套总结表格

声明含义
int& a = b;左值引用,b 必须是左值
const int& a = 10;常量左值引用,可绑定右值
int&& a = 10;右值引用,绑定临时值或移动资源
int x = get(); x = 10;正常赋值
get() = 10;❌ 若 get() 返回右值,非法赋值
getRef() = 10;✅ 若返回引用,是左值,可赋值

十一、小测试题与解析

题 1:哪些是合法声明?

int a = 5;
int& r1 = a;             // ✅
int& r2 = 5;             // ❌,5 是右值
const int& r3 = 5;       // ✅,右值 + const
int&& r4 = 5;            // ✅,右值引用

题 2:以下调用是否合法?

int& get();    // 返回左值引用
int  set();    // 返回右值get() = 10;    // ✅ 合法
set() = 20;    // ❌ 错误,右值不能赋值

总结口诀回顾

“能取地址是左值,临时结果是右值;加 const 能绑定,双&&能转移。”

http://www.dtcms.com/wzjs/597235.html

相关文章:

  • 用网站模板做新网站洛阳霞光营销型网站
  • 苏州网站建设系统价格合理网上卖货哪个平台最好
  • 网站需要多大空间昆山网站制作哪家强
  • 个人网站论文摘要qq空间钓鱼网站后台怎么做
  • thinkphp 网站设置功能网站建设黄页免费观看
  • 中山手机网站建设报价临泉县建设局网站
  • 企业在网站建设中需要做什么杭州设计公司老总
  • 宁波网站建设论坛织梦dedecms资讯文章类网站模板
  • 聊城网站建设设计开发公司网站建设项目实践报告
  • 网站管理后台登录地址运动服装商城网站建设
  • 信游天下网站建设网站建设合同的结构
  • 58同城合肥网站建设wordpress增加百度收录
  • 黑色企业网站惠州的企业网站建设
  • 网站建设概算淘宝做网站的公司
  • 怎么把网站封包做app信息门户网站建设
  • 江门网站建设企业wordpress 做ins
  • 电子商务网站建设课程总结ui设计灵感网站
  • 如何进行一个网站建设网站ui设计兼职
  • 大连商城网站制作网站维护和推广
  • 网站设计方案书ppt涿州市住房和城乡建设局网站
  • 建个企业网站一年需要多少钱品牌提升方案
  • vs和sql怎么做网站商标注册45类明细
  • 济南网站建设的费用百度域名值多少钱
  • 网站设计方案要怎么写下载官方大庆加油app软件
  • 做美术鉴赏网站的心得邢台兼职网站有哪些?
  • 国外个人网站模板上海优化网站方法
  • 自己建一个网站能过期吗wap是什么意思?
  • 昆明商城网站开发oa系统网站建设方案
  • 站长工具 seo综合查询能搜索附近人的软件
  • 广州市官网网站建设多少钱减肥网站开发目的