C++11的一些特性

1. 左值引用 vs 右值引用

左值引用

定义:给左值取别名,用&表示。

特点

  • 能获取地址,有持久状态

  • 可出现在赋值符号左边或右边

  • 主要作用是减少拷贝,提高效率

int a = 10; int& ref_a = a; // 左值引用 const int& const_ref = 20; // const左值引用可以绑定右值

右值引用

定义:给右值取别名,用&&表示。

特点

  • 不能获取地址,通常是临时对象或字面量

  • 只能出现在赋值符号右边

  • 核心作用是实现移动语义,避免深拷贝

int&& rref = 10; // 字面量右值 int&& rref2 = std::move(a); // 将左值转为右值引用

2. 右值引用的使用场景和效率提升

场景1:深拷贝类的移动构造/赋值

对于需要深拷贝的类(如string,vector),移动语义可以"窃取"资源而非拷贝:

class String { private: char* _str; size_t _size; public: // 移动构造函数 String(String&& s) noexcept : _str(s._str), _size(s._size) { s._str = nullptr; // 源对象置空,避免双重释放 s._size = 0; cout << "String移动构造" << endl; } // 移动赋值运算符 String& operator=(String&& s) noexcept { if (this != &s) { delete[] _str; // 释放现有资源 _str = s._str; // 窃取资源 _size = s._size; s._str = nullptr; // 源对象置空 s._size = 0; } cout << "String移动赋值" << endl; return *this; } ~String() { delete[] _str; } };

场景2:传值返回的优化

String createString() { String str("Hello World"); // 局部对象 return str; // 返回值优化 + 移动语义 } int main() { String s = createString(); // 调用移动构造而非拷贝构造 return 0; }

效率对比

  • 拷贝构造:分配新内存 + 复制数据 → O(n)

  • 移动构造:指针交换 → O(1)

场景3:容器操作中的效率提升

vector<String> vec; String s("Large String"); // 传统方式:拷贝构造(低效) vec.push_back(s); // 移动语义:移动构造(高效) vec.push_back(std::move(s)); vec.emplace_back("Direct Construction"); // 最优方式

3. 完美转发(Perfect Forwarding)

问题:右值引用变量在表达式中的属性是左值

解决方案std::forward保持值的原始类别

template<typename T> void wrapper(T&& arg) { // 错误:arg是左值,总是调用左值版本 // process(arg); // 正确:保持arg的原始值类别 process(std::forward<T>(arg)); } void process(int& x) { cout << "左值" << endl; } void process(int&& x) { cout << "右值" << endl; } int main() { int a = 1; wrapper(a); // 调用process(int&) wrapper(2); // 调用process(int&&) wrapper(std::move(a)); // 调用process(int&&) }

4. Lambda表达式:用法和原理

基本语法

[capture-list](parameters) -> return-type { function-body }

捕获方式

int a = 1, b = 2; // 值捕获(拷贝) auto func1 = [a, b]() { return a + b; }; // 引用捕获 auto func2 = [&a, &b]() { a++; b++; }; // 隐式捕获 auto func3 = [=]() { return a + b; }; // 值捕获所有 auto func4 = [&]() { a++; b++; }; // 引用捕获所有 // 混合捕获 auto func5 = [=, &a]() { a++; }; // a引用,其他值捕获

实际应用场景

// 1. 算法定制比较规则 vector<Goods> goods = {{"Apple", 9.9}, {"Banana", 5.5}}; sort(goods.begin(), goods.end(), [](const Goods& g1, const Goods& g2) { return g1.price < g2.price; // 按价格排序 }); // 2. 线程执行函数 thread t([]() { cout << "线程执行中..." << endl; }); // 3. 智能指针删除器 unique_ptr<FILE, function<void(FILE*)>> filePtr(fopen("test.txt", "r"), [](FILE* f) { if(f) fclose(f); });

Lambda原理

编译器将lambda转换为仿函数类:

// lambda表达式 auto lambda = [a](int x) { return a + x; }; // 编译器生成的等价代码 class __lambda_1 { private: int a; // 捕获的变量 public: __lambda_1(int _a) : a(_a) {} int operator()(int x) const { return a + x; } };

5. 综合记忆场景

场景:字符串处理管道

class StringProcessor { private: vector<string> data; public: // 添加数据(支持移动语义) template<typename T> void addData(T&& str) { data.emplace_back(std::forward<T>(str)); } // 处理数据(使用lambda) void process(function<string(string)> transformer) { for(auto& str : data) { str = transformer(str); } } // 过滤数据 vector<string> filter(function<bool(const string&)> predicate) { vector<string> result; copy_if(data.begin(), data.end(), back_inserter(result), predicate); return result; // 移动返回值优化 } }; int main() { StringProcessor processor; // 移动添加大字符串 string largeStr(1000, 'a'); processor.addData(std::move(largeStr)); // 原地处理(lambda) processor.process([](string s) { transform(s.begin(), s.end(), s.begin(), ::toupper); return s; }); // 过滤并获取结果(移动语义优化返回值) auto filtered = processor.filter([](const string& s) { return s.length() > 10; }); }

关键记忆点

  1. 左值引用(&):别名已有对象,减少拷贝

  2. 右值引用(&&):接管临时对象,移动资源

  3. 移动语义:深拷贝类必备,提升容器操作效率

  4. 完美转发:模板编程中保持值类别

  5. Lambda:就地定义函数对象,简化回调代码

  6. 返回值优化:编译器优化 + 移动语义 = 零拷贝返回

通过在实际场景中应用这些特性,可以显著提升C++程序的性能和代码简洁度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1179588.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

非标自动化设备工厂10个SolidWorks研发设计如何共享一台服务器的资源和算力 - 指南

非标自动化设备工厂10个SolidWorks研发设计如何共享一台服务器的资源和算力 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fon…

Playwright数据库断言:测试前后数据验证

在自动化测试中&#xff0c;我们常常会遇到这样的场景&#xff1a;测试一个用户注册功能&#xff0c;接口返回了成功&#xff0c;但你真的确定用户数据正确写入数据库了吗&#xff1f;或者测试一个删除功能后&#xff0c;如何验证数据确实从数据库中移除了&#xff1f;这就是数…

GESP认证C++编程真题解析 | 202309 一级

​欢迎大家订阅我的专栏:算法题解:C++与Python实现! 本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战! 专栏特色 1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的…

docker 搭建canal - BeYourSelf

一、参考文献Docker 安装 canal 详细步骤 乌班图安装java二、环境乌班图操作系统 Docker 29.1.4 Java 11.0.29 rabbitMQ三、前期准备安装Java11 # 先更新源 sudo apt-get update# 安装java11 sudo apt-get install op…

GESP认证C++编程真题解析 | 202309 二级

​欢迎大家订阅我的专栏:算法题解:C++与Python实现! 本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战! 专栏特色 1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的…

2026年中国985高校人工智能专业综合实力十强排名

基于2025-2026年度教育部学科评估情况、CSRankings全球计算机科学排名、U.S.News世界大学学科排名及各高校国家级实验室配置&#xff0c;我们对国内985高校在人工智能领域的综合竞争力进行了深度梳理。第1名&#xff1a;清华大学 作为国内人工智能领域的“领头羊”&#xff0c;…

js函数防抖

1.0 js函数防抖 function debounce(fn, delay = 1000) {let timerId;return function (...args) {clearTimeout(timerId);timerId = setTimeout(() => {fn.apply(this, args);}, delay);}; }2.0 vue自定义ref防抖 i…

LeeCode_17 电话号码的字母组合

17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例 1: 输入:digits =…

Selenium 从环境搭建到 Web 自动化实战

Selenium 是目前最流行的 Web 自动化测试工具,支持 Chrome、Firefox 等主流浏览器,能模拟人工操作(点击、输入、跳转)实现网页自动化,广泛应用于接口测试、数据爬取、自动化部署等场景。本文从零基础入门,手把手…

通信原理篇---PAM与PCM

解释 PAM&#xff08;脉冲幅度调制&#xff09; 和 PCM&#xff08;脉冲编码调制&#xff09; 的区别。1. 基本概念PAM&#xff1a;模拟调制方式&#xff0c;用脉冲序列的幅度来模拟连续信号的瞬时值&#xff0c;仍然是模拟信号。PCM&#xff1a;数字调制方式&#xff0c;先对模…

GESP认证C++编程真题解析 | 202309 四级

​欢迎大家订阅我的专栏:算法题解:C++与Python实现! 本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战! 专栏特色 1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的…

P1339 Heat Wave G

点击查看代码 #include<bits/stdc++.h> using namespace std; typedef pair<int,int> PII; const int N=3000; const int M=7000*2; int n,m,s,t; struct Edge{int to;int w;int ne; }edge[M]; int h[N]; …

P2910 Clear And Present Danger S

点击查看代码 #include<bits/stdc++.h> using namespace std;const int N=110; const int M=10010; int n,m; int p[N]; int dist[N][N]; long long ans;int main() {ios::sync_with_stdio(0),cin.tie(0);cin>…

职场晋升需要 AI 证书,选偏理论还是偏实操的更有用?

在职场晋升场景中&#xff0c;AI证书的价值需结合实用性判断。多数情况下&#xff0c;偏实操属性的证书更能适配企业“以结果为导向”的评估逻辑&#xff0c;其承载的技能可直接转化为工作效率与业务成果&#xff1b;理论类证书仅适合特定场景作为补充&#xff0c;难以成为晋升…

TCP 协议深度解析与实践:从零基础到精通

📚 学习路径:本文适合不同层次的读者🟢 小白级:了解网络基础、TCP 基本概念 🟡 初级:掌握 TCP 连接过程、Python Socket 编程 🟠 中级:理解 TCP 可靠性机制、实战应用 🔴 精通级:深入 TCP 内核机制、性…

小程序毕设选题推荐:基于springboot+微信小程序的校园竞赛管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

> STM32-200-多功能门禁人脸识别指纹识别RFID刷卡密码(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

STM32-200-多功能门禁人脸识别指纹识别RFID刷卡密码(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码产品功能描述&#xff1a; 本系统由STM32F103C8T6单片机核心板、1.44寸TFT彩屏、&#xff08;无线蓝牙/无线WIFI/无线视频监控…

数据质量与主数据管理:确保企业核心数据准确

数据质量与主数据管理&#xff1a;确保企业核心数据准确 1. 引入与连接 1.1 引人入胜的开场 想象一下&#xff0c;一家大型零售企业计划推出一系列针对特定客户群体的促销活动。营销团队精心策划了方案&#xff0c;投入了大量资源进行宣传推广。然而&#xff0c;活动结束后却发…

51-C40-温湿度检测+上下限+加热+空调降温+加湿+除湿+手动+自动+OLED屏+声光报警+按键+(无线方式选择)(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

51-C40-温湿度检测上下限加热空调降温加湿除湿手动自动OLED屏声光报警按键(无线方式选择)51-C040B蓝牙无线-APP版: 51-C040W-WIFI无线-APP版: 51-C040CAN-视频监控WIFI无线-APP版: 产品功能描述&#xff1a; 本系统由51单片机最小系统电路、OLED屏、&#xff08;无线蓝牙/无线W…

数论2:gcd、lcm与exgcd

数论2:gcd、lcm与exgcdgcd:Greatest Common Divisor,最大公约数,即对于不全为0的整数p、q,存在一最大的整数r,使得r|p、r|q且对于任意整数s,s|p且s|q,有r>=s。 记作gcd(p,q),特别的,gcd(a,0) = |a| (a!=0…