C++ 11新特性

C++11的新特性 C++11标准引入了许多重要的新特性,这些特性旨在提高C++的编程效率、安全性和性能。 阅读详情

C++11引入了众多新特性,以下是一些比较常用且重要的新特性介绍:

1. 语言核心特性增强

  • 自动类型推断(auto关键字):
    编译器可以根据变量的初始值自动推断其类型,简化了复杂类型变量的声明,尤其适用于迭代器、lambda表达式等返回复杂类型的情况。例如:
auto i = 5;  // i被推断为int类型
auto it = std::vector<int>{1, 2, 3}.begin();  // it被推断为std::vector<int>::iterator类型
  • 范围for循环:
    能够简洁地遍历容器或可迭代对象,让代码更易读、易写。语法形式如下:
std::vector<int> vec = {1, 2, 3};
for (auto element : vec) {
    std::cout << element << " ";
}
// 输出: 1 2 3
  • nullptr关键字:
    用于表示空指针,替代原来容易产生歧义的NULL(在C++中NULL实际是int类型的宏定义,而nullptr是专门的指针类型常量),增强了代码的类型安全性。例如:
int* ptr = nullptr;

2. 初始化列表(std::initializer_list)

允许使用花括号{}来初始化对象,支持对自定义类型、容器等进行初始化,方便且直观。例如:

std::vector<int> v = {1, 2, 3};
struct Point {
    int x;
    int y;
};
Point p = {10, 20};

同时,函数也可以接受初始化列表作为参数,比如:

void printElements(std::initializer_list<int> list) {
    for (auto element : list) {
        std::cout << element << " ";
    }
    std::cout << std::endl;
}
printElements({1, 2, 3});

3. Lambda表达式

可以在代码中创建匿名函数,方便在需要函数对象的地方(如std::sort算法的比较函数、std::for_each的操作函数等)快速定义简单的函数逻辑。语法形式一般为:

[捕获列表](参数列表) -> 返回类型 {函数体}

例如,对一个vector进行排序,使用lambda表达式定义比较函数:

std::vector<int> numbers = {5, 3, 1, 4, 2};
std::sort(numbers.begin(), numbers.end(), [](int a, int b) -> bool { return a < b; });

捕获列表可以捕获外部变量供lambda函数内部使用,如按值捕获、按引用捕获等,示例如下:

int factor = 2;
std::vector<int> nums = {1, 2, 3};
std::for_each(nums.begin(), nums.end(), [factor](int& num) { num *= factor; });

4. 右值引用与移动语义

  • 右值引用(&&):
    是一种新的引用类型,用于绑定到右值(临时对象、表达式返回值等),与传统左值引用区分开,开启了移动语义等优化操作的可能性。例如:
int&& rvalueRef = 10;  // 绑定到右值(字面量常量)
  • 移动语义:
    通过定义移动构造函数(如ClassName(ClassName&& other))和移动赋值运算符(如ClassName& operator=(ClassName&& other)),实现将临时对象(右值)的资源高效地“移动”给另一个对象,避免了传统拷贝语义下的资源深拷贝,提升性能。例如:
class MyString {
private:
    char* data;
    size_t length;
public:
    // 移动构造函数示例
    MyString(MyString&& other) : data(other.data), length(other.length) {
        other.data = nullptr;
        other.length = 0;
    }
    // 省略其他成员函数
};

5. 新的容器和容器相关特性

  • std::array:
    是一个固定大小的数组容器,它结合了普通数组的性能优势和容器类的一些方便特性(如begin、end迭代器方法等),在编译期确定大小,更安全、易用。例如:
std::array<int, 5> arr = {1, 2, 3, 4, 5};
  • std::forward_list:
    是一个单向链表容器,适合一些只需单向遍历、对插入删除操作效率有要求的场景,相比于std::list(双向链表)在空间上可能更节省,操作开销也有不同特点。例如:
std::forward_list<int> flist;
flist.push_front(1);
flist.push_front(2);
  • std::unordered_map和std::unordered_set:
    基于哈希表实现,相比于传统的std::map(红黑树实现)和std::set,在查找、插入、删除操作上平均时间复杂度更低(接近常数时间),适用于对查找性能要求较高、不要求元素有序的场景。例如:
std::unordered_map<std::string, int> umap;
umap["apple"] = 5;
umap["banana"] = 3;

6. 多线程支持(std::thread、std::mutex等)

  • std::thread:
    用于创建和管理线程,使得在C++中编写多线程程序更加方便、直观。例如:
#include <iostream>
#include <thread>

void hello() {
    std::cout << "Hello from thread " << std::this_thread::get_id() << std::endl;
}

int main() {
    std::thread t(hello);
    std::cout << "Hello from main thread " << std::this_thread::get_id() << std::endl;
    t.join();
    return 0;
}
  • std::mutex(互斥锁)及其相关类型(std::lock_guard等):
    用于保护共享资源,防止多个线程同时访问导致数据不一致等问题。std::lock_guard是一种方便的RAII(Resource Acquisition Is Initialization)机制的锁管理类,能自动在构造函数中锁定互斥锁,在析构函数中解锁,避免了手动管理锁的释放问题。例如:
std::mutex mutex;
int sharedData = 0;
void increment() {
    std::lock_guard<std::mutex> guard(mutex);
    sharedData++;
}

7. 类型别名(using关键字)

使用using关键字可以为已有类型定义别名,相比typedef,它的语法更加直观、灵活,特别是在定义模板别名等复杂情况时优势明显。例如:

using IntVector = std::vector<int>;
IntVector v = {1, 2, 3};
// 定义函数指针类型别名示例
using FuncPtr = void (*)(int);

8. 委托构造函数(Delegating Constructors)

允许在一个构造函数中调用同一个类的其他构造函数,减少代码重复,方便初始化逻辑的复用。例如:

class Point {
public:
    Point(int xVal, int yVal) : x(xVal), y(yVal) {}
    Point() : Point(0, 0) {}  // 委托构造函数,调用有参数的构造函数进行初始化
private:
    int x;
    int y;
};

9. 显式虚函数重载(override关键字)

在派生类中重写基类的虚函数时,可以使用override关键字来显式表明这是一个重写操作。这样编译器能帮我们检查是否正确重写了虚函数(比如函数签名是否一致等),避免一些因重写错误导致的运行时问题。例如:

class Base {
public:
    virtual void func() {}
};
class Derived : public Base {
public:
    void func() override {  // 使用override关键字
        // 具体实现
    }
};

10. 常量表达式(constexpr)

可以让函数或对象在编译期求值,扩大了编译期计算的范围,常用于定义编译期就能确定值的常量、数组大小等,提升程序性能和可预测性。例如:

constexpr int factorial(int n) {
    return (n <= 1)? 1 : n * factorial(n - 1);
}
constexpr int result = factorial(5);  // 在编译期计算阶乘结果

这些只是C++11众多新特性中的一部分,它们为C++编程带来了更多便利、高效以及功能上的拓展,让开发者可以写出更现代、更强大的C++代码。

宇树G1双足机器人SLAM开发环境搭建实战指南 SLAM(同步定位与建图)是机器人自主导航的核心技术。在双足人形机器人平台上,由于运动模型复杂、机身晃动带来高频IMU噪声,SLAM开发对环境配置和依赖管理提出了更高要求。以宇树G1为例,系统阐述如何通过Ubuntu 20.04、ROS Noetic与Docker容器化方案构建可复现的SLAM开发环境。先介绍依赖分层管理与版本锁定原理,再深入catkin工作空间编译、传感器驱动集成、网络与多机通信配置等工程实践,最后提供常见问题排查与避坑指南。这套方法论不仅适用于G1,也可迁移至其他双足或轮式机器人平台,帮 阅读详情

相关推荐

Docker部署Nextcloud私有云:MariaDB、OnlyOffice与HTTPS全栈实践

Nextcloud作为主流开源私有云平台,其稳定部署依赖Docker容器化、MariaDB数据库优化、OnlyOffice在线协作集成及HTTPS安全加固四大核心技术。理解Docker Compose服务健康检查机制与依赖等待原理,可避免因启动时序导致的500/404错误;掌握MariaDB字符集配置与InnoDB参数调优,是保障Nextcloud全文搜索与大文件上传可靠性的底层基础;而OnlyOffice的JWT兼容性控制与Nginx路径重写规则,则直接决定文档协同功能是否可用。在家庭NAS、边缘服务器或

weixin_30328063的博客 514

【C++基础】C++11的新特性

C++新特性主要包括包含语法改进和标准库扩充两个方面

dnty00的博客 1万+

C++中const和指针*的组合问题

今天在复习> 章节7.3的时候想到以前做的一个题,const和指针运算符*的若干种组合的合法性和意义问题,有点混淆,所以写了一个测试代码来验证一下,简单明了,一目了然。如果有什么遗漏的话欢迎指出。 首先是在Ubuntu14.04.1下用gcc 4.8.4编译运行的结果,编译器报错信息都附加在对应语句后面的注释里 /* * Note : Test for the combinations of

theColdOne的专栏 1080

C++11新特性

C++11新特性

冯同学的博客 5934

修改Avaya IP-Office电话交换机出厂自带的提示语音内容

1,本文的应用场景是在使用Avaya IP-office 500 v2电话交换机时,来电振铃超时后,会转入语音信箱,呼叫者会听到一条语音信箱留言的欢迎辞(…请留言…)。但我们单位情况比较特殊,首先是的IPO配置很精简,内嵌的语音信箱只能保留3天,用处不大;其次是用户没有收听语音信箱的习惯;第三是我们单位使用数字中继和DID,每人一个直拨号码,不通过总机转接。很多业务是单线联系,所以一旦来电无法接通,来电者可能完全无法联系到我们单位的其他同事。出于这三点原因,我们希望将语音信箱的欢迎辞,增加告知我们的总机电话

qlin4cn的博客 4917

基于STM32设计的老人摔倒检测报警系统【升级版】(235)

在 `235 基于STM32设计的老人摔倒检测报警系统(OneNet+MQTT)` 项目基础上增加了心率、血氧、体温测量3个功能。

1508

c++11新特性

在传统C头文件(stddef.h)中的定义如下。

wangzai32100的博客 5565

基于simulink的电气弹簧ES稳压控制模型仿真

若要补偿母线电压的谐波,需控制ES上的谐波,即在单闭环母线电压有效值控制的基础上,增加谐波抑制环节来进行谐波控制,现有的各种检测和抑制谐波的方法有采用模拟滤波器、傅里叶分析进行谐波分析、基于瞬时无功功率理论的方法等。当关键负载ZC为电流源型非线性负载时,电路原理图如图7所示,由于电流源型非线性负载可以等效为谐波电流源,关键负载电流ic便会含有谐波分量,导致输电线电流is和母线电压VS同样会含有谐波分量,导致供电质量的严重下降,对用电设备的正常工作造成影响。分别为流过线路阻抗、非关键负载、关键负载的电流,

FPGA/MATLAB学习教程/源码/项目合作开发 1630

C++11特性(详细版)

C111、C11优势2、列表初始化3、变量类型推导1、为什么需要类型推导2、decltype类型推导(了解)为什么需要decltypedecltype4、final 与 overridefinaloverride5、默认成员函数控制1、显示缺省函数2、删除默认函数(禁止调用)6、右值引用与移动语义1、左值引用和右值引用1、什么是左值?什么是左值引用?2、什么是右值?什么是右值引用?2、左值引用与右值引用比较3、右值引用使用场景和意义7、完美转发8、新的类功能 1、C11优势   相比C++98/03,C++

weixin_46873777的博客 3万+

把 SAP OData 查询模式讲透:从 $select 到 $expand 的设计、实现与性能边界

摘要:本文深入探讨SAP生态中OData查询模式的核心设计与实现要点。文章指出,OData不仅是接口协议,更是HTTP、REST与数据模型的统一语言,其性能关键取决于查询选项($select、$filter等)的设计与实现质量。重点分析了$select的投影优化、$orderby的排序语义、$filter的数据库下推策略,以及$count的高效计数方法。通过具体示例和最佳实践,强调应将查询逻辑尽量下推至数据库层,避免在ABAP应用层处理大数据集,从而提升服务性能、降低资源消耗,实现Clean Core架构理

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 648

【ROS2】从yaml文件中读取参数配置

ROS2:从yaml中读取参数,到节点;使用C++演示参数的增、删、改、查、遍历、监听变化

郭老二 1284

CPP——C++ 11的新特性

本文转载自: http://www.yanjiankang.cn/cpp_11_new_feature/ Lambda 表达式 Lambda 表达式就是用于创建匿名函数的。 为什么说 lambda 表达式如此激动人心呢?举一个例子。标准 C++ 库中有一个常用算法的库,其中提供了很多算法函数,比如 sort() 和 find()。这些函数通常需要提供一个“谓词函数 predicate functi...

Monster_ixx的博客 488

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【面试知识整理】CPP——C++ 11的新特性

【面试知识整理】CPP——C++ 11的新特性作者yanhealth发表于2017-02-12原创文章,转载请注明: 转载自:严健康的个人博客 http://www.yanjiankang.cn/本文链接地址: http://www.yanjiankang.cn/cpp_11_new_feature/Lambda 表达式Lambda 表达式就是用于创建匿名函数的。为什么说 lambda 表达式如此...

caogenwangbaoqiang的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Cpp::C++11新特性入门(29)

哈喽,结束了C++最难的部分,现在我们又要迎来奖励关卡了!C++11同C++98都是C++历史上比较大的一个版本,现在我们来学习一下它吧!C++11文档介绍奖励关卡结束啦,下一篇我们就要来上难度了!

tan180°的博客 2020

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

c++ 常用新特性总结【c++11】,【c++14】,【c++17】,【c++20】

一文总结了c++常见的新特性,在c++推出的新特性中,c++11无疑是最具影响力的,其次是c++17与c++14。

Ray 6221

【C++】C++11新特性的讲解

C++11简介在2003年C++标准委员会曾经提交了一份技术勘误表简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于C++98/03C++11。

Sxy_wspsby的博客 1242

【C++】:C++11新特性

在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于。

优快云官方认证C/C++研发领域优质创作者 优快云官方2023年成都赛道Top3 第16届蓝桥杯C/C++软件赛四川赛区二等奖 带你玩转C/C++ 数据结构与算法 Linux系统编程/Linux网络编程 MySQL数据库 软件测试开发 1065

C++11新特性详解

相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率。在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。thread在线文档说明stdreturn0。...

AI_ELF的博客 1万+

【C++】——C++11新特性

C++,这门在系统开发、游戏开发、嵌入式等众多领域都占据主导地位的编程语言,一直在不断进化。C++11就像是C++家族中的一颗璀璨明星,闪耀着无数令人惊叹的新特性。如果你还在使用传统的C++编码方式,那你可能正在错过许多现代编程的便捷与高效。想象一下,用更少的代码编写出性能更高的程序,轻松应对复杂的并发场景,还能享受更加简洁和安全的内存管理。C++11就能让这一切成为现实。在这篇博文中,我会一点点揭开C++11新特性的神秘面纱,让你看到C++在这次重大更新之后所蕴含的无限潜力。

2402_85267481的博客 1874

【C++】C++11新特性

无需再拷贝一份,大大提升效率。例如某个函数返回对象时,寄存器需要有临时对象来接受,此时会调用一次拷贝构造函数,此时该临时需要赋值给新的接受对象则需要再调用一次拷贝构造,效率低下,使用右值引用寄存器中的临时对象进行语义转化,新对象接受时不用调用拷贝构造函数。,auto_ptr、unique_ptr、shared_ptr这三个智能指针模板类都定义了类似指针的对象,可以将new获得的地址赋给这种对象,当智能指针过期时,的方式,当引用计数为0时才进行析构,很好的解决了该问题,旧指针和新指针都可以使用。

csdnabcaq的博客 2103

『C++11』基础新特性

自从C++98以来,C++11无疑是一个相当成功的版本更新。它引入了许多重要的语言特性和标准库增强,为C++编程带来了重大的改进和便利。C++11的发布标志着C++语言的现代化和进步,为程序员提供了更多工具和选项来编写高效、可维护和现代的代码1998年C++标准委员会成立后,计划每五年进行一次更新在2003年C++标准委员会提交了一份技术勘误表(简称为TC1),TC1主要是对C++98标准中的漏洞进行修复,其语言的核心部分并没有大改动,这次提交可以看作一次小小的语法更新,即C++03。

Aron的博客 1782

学懂C++(六十):C++ 11、C++ 14、C++ 17、C++ 20新特性大总结(万字详解大全)

C++ 11、C++ 14、C++ 17、C++ 20新特性总结(万字详解大全)

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 4807

C++11——新特性超详细总结

18. 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$17. 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$

m0_65635427的博客 7634

C++11-C++17新特性介绍

本篇只包含c++11- c++17的新特性, 一些c++基本规定不再赘述前文c++规定记录了c++基本规定对于这些新特性,笔者一边学习一边做笔记,所以内容有待完善笔者使用的是 Clion+MinGW 开发环境提示:以下是本篇文章正文内容,下面案例可供参考using 覆盖了 typedef 的全部功能// 重定义unsigned int// 重定义std::map//定义函数类型和模板的结合使用// ...别名模板(alias template)

Computer_Tech的博客 2629

c++11新特性总结

11。

m0_74803679的博客 201
上一篇: 重温设计模式--代理、中介者、适配器模式的异同
下一篇: 测试客户端
越甲八千
博客等级 码龄11年 2953粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值