C++11 引入了的新特性与实例说明

只谈C++11新特性 - Noexcept 说明符 noexcept是一种用于声明函数不会抛出异常的关键字,它相比throw编译期检查noexcept能够在编译期确定函数是否可以抛出异常,从而避免运行时检查带来的开销。性能优化:编译器可以利用noexcept的信息对代码进行优化,例如在std::move和容器操作中。语义清晰noexcept明确声明了函数的异常安全性,增强了代码的可读性和可维护性。noexcept// 表示 func 不会抛出异常此外,还可以使用形式,其中expression是一个布尔表达式,返回值为true时表示函数不会抛出异常。 阅读详情

C++11 引入了许多重要的新特性,以下是一些关键特性及其对应的示例代码,用于体现这些特性的用法和优势。


1. 自动类型推导 (auto)

auto 关键字允许编译器自动推导变量的类型,简化代码书写。

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 使用 auto 自动推导迭代器类型
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        std::cout << *it << " ";
    }

    // 使用 auto 推导元素类型
    for (auto& value : vec) {
        std::cout << value << " ";
    }

    return 0;
}

2. 范围基于的 for 循环

范围 for 循环简化了对容器或数组的遍历。

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 使用范围 for 循环遍历容器
    for (const auto& value : vec) {
        std::cout << value << " ";
    }

    return 0;
}

3. Lambda 表达式

Lambda 表达式允许在代码中定义匿名函数,常用于简化回调函数或算法中的函数对象。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 使用 Lambda 表达式作为谓词
    std::sort(vec.begin(), vec.end(), [](int a, int b) {
        return a > b; // 降序排序
    });

    for (const auto& value : vec) {
        std::cout << value << " ";
    }

    return 0;
}

4. 右值引用和移动语义 (std::move)

右值引用和移动语义允许高效地转移资源,避免不必要的拷贝。

#include <iostream>
#include <string>

class MyString {
public:
    MyString(const char* str) {
        std::cout << "Constructor called!" << std::endl;
        size = strlen(str);
        data = new char[size + 1];
        memcpy(data, str, size + 1);
    }

    // 移动构造函数
    MyString(MyString&& other) noexcept {
        std::cout << "Move constructor called!" << std::endl;
        data = other.data;
        size = other.size;
        other.data = nullptr;
        other.size = 0;
    }

    ~MyString() {
        delete[] data;
    }

    void print() const {
        std::cout << data << std::endl;
    }

private:
    char* data;
    size_t size;
};

int main() {
    MyString s1("Hello");
    MyString s2 = std::move(s1); // 调用移动构造函数

    s2.print(); // 输出: Hello
    // s1.print(); // 错误:s1 的资源已被转移

    return 0;
}

5. 智能指针 (std::unique_ptr, std::shared_ptr)

智能指针用于自动管理动态内存,避免内存泄漏。

#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass() {
        std::cout << "MyClass constructed!" << std::endl;
    }

    ~MyClass() {
        std::cout << "MyClass destroyed!" << std::endl;
    }

    void doSomething() {
        std::cout << "Doing something!" << std::endl;
    }
};

int main() {
    // 使用 std::unique_ptr
    std::unique_ptr<MyClass> ptr1(new MyClass());
    ptr1->doSomething();

    // 使用 std::shared_ptr
    std::shared_ptr<MyClass> ptr2 = std::make_shared<MyClass>();
    ptr2->doSomething();

    return 0;
}

6. nullptr 关键字

nullptr 用于替代 NULL,表示空指针,避免类型歧义。

#include <iostream>

void foo(int* ptr) {
    if (ptr) {
        std::cout << "Pointer is not null!" << std::endl;
    } else {
        std::cout << "Pointer is null!" << std::endl;
    }
}

int main() {
    int* ptr = nullptr;
    foo(ptr); // 输出: Pointer is null!

    int x = 10;
    ptr = &x;
    foo(ptr); // 输出: Pointer is not null!

    return 0;
}

7. std::thread 多线程支持

C++11 引入了标准库对多线程的支持。

#include <iostream>
#include <thread>

void threadFunction() {
    std::cout << "Hello from thread!" << std::endl;
}

int main() {
    std::thread t(threadFunction);
    t.join(); // 等待线程结束
    std::cout << "Main thread finished!" << std::endl;
    return 0;
}

8. std::function 和 std::bind

std::function 用于存储可调用对象,std::bind 用于绑定参数。

#include <iostream>
#include <functional>

void printSum(int a, int b) {
    std::cout << "Sum: " << a + b << std::endl;
}

int main() {
    // 使用 std::function 存储可调用对象
    std::function<void(int, int)> func = printSum;
    func(2, 3); // 输出: Sum: 5

    // 使用 std::bind 绑定参数
    auto boundFunc = std::bind(printSum, 10, std::placeholders::_1);
    boundFunc(5); // 输出: Sum: 15

    return 0;
}

9. constexpr 常量表达式

constexpr 用于在编译时计算常量表达式。

#include <iostream>

constexpr int factorial(int n) {
    return (n <= 1) ? 1 : n * factorial(n - 1);
}

int main() {
    constexpr int result = factorial(5); // 编译时计算
    std::cout << "Factorial of 5: " << result << std::endl; // 输出: 120
    return 0;
}

10. std::array 和 std::tuple

std::array 是固定大小的数组容器,std::tuple 用于存储多个不同类型的值。

#include <iostream>
#include <array>
#include <tuple>

int main() {
    // 使用 std::array
    std::array<int, 3> arr = {1, 2, 3};
    for (const auto& value : arr) {
        std::cout << value << " ";
    }
    std::cout << std::endl;

    // 使用 std::tuple
    std::tuple<int, double, std::string> tup(10, 3.14, "Hello");
    std::cout << std::get<0>(tup) << " " << std::get<1>(tup) << " " << std::get<2>(tup) << std::endl;

    return 0;
}

总结

以上示例展示了 C++11 中一些重要的新特性,包括自动类型推导、范围 for 循环、Lambda 表达式、移动语义、智能指针、nullptr、多线程支持、std::function 和 std::bind、constexpr 以及 std::array 和 std::tuple。这些特性极大地提高了 C++ 的现代化编程能力。

探索 Qt 5 中的 C++11 新特性 随着 C++11 成为 C++ 的标准,越来越多的开发者开始在新项目中使用这一现代 C++ 版本。Qt 作为一个广泛使用的跨平台 C++ 框架,也在 Qt 5 中全面拥抱了 C++11 的新特性。本文将带你了解如何在 Qt 5 中结合使用 C++11 的新特性,并展示这些特性如何提升代码的简洁性和性能。 阅读详情

相关推荐

C++11 新特性 ⑤ | 仿函数与 lambda 表达式

详细讲解仿函数与lambda表达式相关内容。

dvlinker的技术专栏 1万+

c++ 里面的auto用法

总述: auto的原理就是根据后面的值,来自己推测前面的类型是什么。 auto的作用就是为了简化变量初始化,如果这个变量有一个很长很长的初始化类型,就可以用auto代替。 注意点: 1.用auto声明的变量必须初始化(auto是根据后面的值来推测这个变量的类型,如果后面没有值,自然会报错) 2.函数和模板参数不能被声明为auto(原因同上) 3.因为auto是一个占位符,并不是一个他自己的类型,因此不能用于类型转换或其他一些操作,如sizeof和typeid 4.定义在一个auto序列的变量必须始

m0_59081230的博客 1285

C++11 新特性 ① | C++11 常用关键字实战详解

本文结合工作实践详细介绍C++11 常用关键字,以供借鉴或参考。

dvlinker的技术专栏 2万+

C++新特性03_迭代器iterator及类型推导auto(迭代器:用于容器中数据遍历;动态数组(vector)和链表(list)遍历;堆上下限标志位;类型推导auto:编译时自动推导数据类型)

迭代器:用于stl中数据的遍历操作 stl中存在一些常见的已经封装好(开箱即食)数据结构相关的模板类,例如vector(动态数组),list(链表), stack(栈),queue(队列),map(hash表/红黑树)等。这些类通常都有一些最基本的操作,例如:增加,删除,修改,遍历等等。 C++为了方便统一,采用了设计模式中的迭代器模式,也就是统一的提供了一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。我们一般对这些数据结构的遍历都可以无脑使用迭代器,而不关心内部存储的差异。 1.普通

分享学习成长历程,Winter is coming! 3343

硬件设计--DC/DC电源芯片详解

本文参考:http://www.elecfans.com/article/83/116/2018/20180207631874.html https://blog.youkuaiyun.com/wangdapao12138/article/details/79763343 第一次写博客,不喜勿喷,谢谢!!! DC/DC电源指直流转换为直流的电源,从这个定义上看,LDO(低压差线性稳压器)芯片也应该属于D...

weixin_30794499的博客 7875

不用Root也能抓包?Android高版本HTTPS抓包的3种替代方案(含Charles技巧)

本文针对Android高版本HTTPS抓包难题,提供了三种无需Root权限的实战解决方案:利用VirtualXposed等虚拟沙盒环境、配置Postern等系统级代理工具,以及通过修改应用源码或网络安全配置。文章还详细解析了Charles抓包工具在非Root环境下的高级配置与排错技巧,帮助开发者在遵守安全规范的前提下,有效进行网络调试与监控。

http9protocoller的博客 647

C++利用auto对std::vector进行遍历时auto的类型

C++中利用auto对std::vector进行遍历

muguang629的博客 4668

软件工程大作业——图书管理系统/图书个性化推荐与实现系统

软件工程期末大作业,图书管理系统,包含ER图、程序流程图、属性图、结构图

2401_82857325的博客 3648

【C++】vector笔记+模拟实现

vector笔记和实现

iluo12的博客 3383

Python3.8下MvCameraControl.dll加载失败?3种方法彻底解决FileNotFoundError

本文针对Python3.8及以上版本在Windows平台调用MvCameraControl.dll时出现的FileNotFoundError问题,深入剖析了其根源在于Python 3.8引入的DLL加载安全机制变更。文章提供了三种核心解决方案:显式指定DLL完整路径、使用os.add_dll_directory()添加可信目录,以及利用ctypes的winmode参数进行精细控制,并给出了工程化封装建议,帮助开发者彻底解决此兼容性问题。

weixin_29093017的博客 191

公文流转系统

公文录入区 | QLineEdit(文号/标题)、QComboBox(公文类型/紧急程度)、QTextEdit(正文)、QListWidget(附件列表)、QPushButton(上传附件/保存草稿/提交审批) |// 按时间范围获取。QStringList userNames = {"张三", "李四", "王五", "赵六", "钱七", "孙八", "周九", "吴十", "郑十一", "王十二"};

寒寒豆豆软件公司的博客 550

C++ 11 vector 的遍历,auto关键词(未完)

遍历vector方式 假设有这样的一个vector: vector<int> line={1,2,3,4,5,6,7,8,9}; 需要我们去遍历它。 void showvec(const vector<int>& line) { for (vector<int>::const_iterator iter = line.cbegin();iter !...

笔记 1万+

【肌电处理】肌电信号EMG积分肌电值+均方根值+中值频率+平均功率频率【含Matlab源码 3386期】

肌电信号EMG积分肌电值+均方根值+中值频率+平均功率频率 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 823

【C++新特性】 - 类内初始值

如果定义变量时没有指定初值,则变量被默认初始化,此时变量被赋予了“默认值”。默认值到底是什么由变量类型和变量所在位置决定。 如果是内置类型(int, short等)的变量为被显示初始化,它的值由定义的位置决定。定义与任何函数体之外的变量被初始化为0,定义在函数体内部的内置变量将不被初始化,其值时未定义的。 C++11新标准规定可以为数据成员提供一个类内初始值(in-class initializer)。创建对象时,类内初始值将用于初始化数据成员,没有初始值的成员将被默认初始化。 1、类内初始值和赋值类

BruceZong的专栏 4513

华为OD机试 - 计算数列位置N的值 - 模拟法(Python/JS/C/C++ 新系统 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。输入 M,N 两个数,则按照以下规则形成一个数列。数列的前 M 个元素的值为 1 到 M从 M+1 个元素开始,计算逻辑为如果其前 M 个元素中,存在值相同的元素,则该位置上的数值等于前 M 个数中最大数值与最小数值之和。如果其前 M 个元素中,

学Java,找哪吒 508

YOLOv8改进策略【Backbone/主干网络】| 2023 U-Net V2 替换骨干网络,加强细节特征的提取和融合

一、本文介绍 本文记录的是基于U-Net V2的YOLOv8目标检测改进方法研究。本文利用U-Net V2替换YOLOv8的骨干网络,UNet V2通过其独特的语义和细节融合模块(SDI),能够为骨干网络提供更丰富的特征表示。并且其中的注意力模块可以使网络聚焦于图像中与任务相关的区域,增强对关键区域特征的提取,进而提高模型精度。本文配置了原论文中pvt_v2_b0、pvt_v2_b1、pvt_v2_b2、pvt_v2_b3、pvt_v2_b4和pvt_v2_b5六种模型,以满足不同的需求。 文章目录一、本文

Limiiiing的博客 1721

C++ Prime Plus 学习笔记041

电脑信息:Intel® Xeon® CPU E5-2603 v3 @ 1.60GHz。系统类型:64位操作系统,基于X64的处理器 windows10 专业版。书籍:C++ Primer Plus (第六版)(中文版)附录E.3 alignof (C++11)18.1 复习前面介绍过的C++11功能。18.7 C++11新增的其他功能。实例E.1 memb_pt.cpp。实例E.2 align.cpp。18.2 移动语义和右值引用。18.4 Lamnda函数。18.6 可变参数模板。

weixin_69179903的博客 372

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++11新特性一览 - 引自《C++ Primer》

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可

weixin_53833977的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

老版QQ原生表情gif动态

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

C++11新特性总结

一、概述 C++11新特性包括auto、decltype、constexpr、右值引用、move()函数、完美转发、移动构造、lambda匿名函数、for循环新格式、nullptr、shared_ptr、weak_ptr、unique_ptr、using定义别名、函数模板默认参数、tuple元组、非受限联合体、placement new、longlong int等。 二、正文 以下是我在学习过程中记录下来的笔记总结,实际代码较少,大多是知识点,比如相关的特性、定义、限制、作用和说明等等,放上一半的内容

weixin_44178960的博客 4997

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++11新特性

什么是C++11 C++11是曾经被叫做C++0x,是对目前C++语言的扩展和修正,C++11不仅包含核心语言的新机能,而且扩展了C++的标准程序库(STL),并入了大部分的C++ Technical Report 1(TR1)程序库(数学的特殊函数除外)。 C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto、decltype,和模板的大量改进。 本文将对C++11的以上新特性进行简单的讲解,以便大家能够快速了解到C++11对C++的易用性方面起到的巨大作用。 C++11

8078

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年磨一剑,第二个真正意义上的标准珊珊来迟。

kk6kk的博客 820

C++11新特性— auto 和 decltype 区别和联系

编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型。然而做到这一点并非那么容易(特别是模板中),有时候根本做不到。为了解决这个问题,C++11新标准就引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。和原来那些只对应某种特定的类型说明符(例如 int)不同。auto 让编译器通过初始值来进行类型推演。从而获得定义变量的类型,所以说 auto 定义的变量必须有初始值。 有的时候我们还会遇到这种情况,我们希望从表达式中推断出要定义变量的类型,但却不想用表达式

YzlCoder的记事本 2万+

[C++11] 枚举新特性完整解析

说明:C++11 关于新枚举的引入,主要有以下几个方面:强类型枚举(enum class):这是一种新的枚举类型,它提供了更强的类型检查。枚举类成员的底层类型:在枚举类中,可以明确指定枚举成员的底层整数类型。自动枚举值:这个特性允许枚举成员自动从 0 开始赋值,并且依次递增。枚举类型的字面量:枚举类型可以作为编译时常量使用,这使得枚举值可以在模板元编程和编译时决策中发挥作用。

wangdsh的博客 4844

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年磨一剑,第二个真正意义上的标准珊珊来迟。

weixin_51142926的博客 2537

学懂C++(五十三):全面解析:C++11 标准及其新特性详解

学懂C++:全面解析:C++11 标准及其新特性详解

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 3323
上一篇: QSettings修改配置后强制重启应用导致配置文件大小为0问题
下一篇: 《沉思录》
froxy
博客等级 码龄15年 208粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值