C++学习笔记——C++ 新标准(C++11、C++14、C++17)引入的重要特性

这篇具有很好参考价值的文章主要介绍了C++学习笔记——C++ 新标准(C++11、C++14、C++17)引入的重要特性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++学习笔记——C++ 新标准(C++11、C++14、C++17)引入的重要特性,C++的学习笔记,c++,学习,笔记

目录

1、简介

2.自动类型推导和初始化

示例代码

3.智能指针

示例代码

4.Lambda 表达式

示例代码

5.右值引用和移动语义

示例代码

6.并发编程支持

示例代码

7.其他特性

八、案例:实现一个简单的并发下载器


上一篇文章:

    C++标准模板库(STL)是C++的一个重要组成部分,它提供了一套丰富的通用数据结构和算法。STL以其高度模块化、可复用的特性,在C++编程中发挥着重要作用。本篇博客将带你深入了解STL,并介绍其常见的组件和使用方法。

C++学习笔记——标准模板库-CSDN博客C++标准模板库(STL)是C++的一个重要组成部分,它提供了一套丰富的通用数据结构和算法。STL以其高度模块化、可复用的特性,在C++编程中发挥着重要作用。本篇博客将带你深入了解STL,并介绍其常见的组件和使用方法。C++标准模板库(STL)是C++语言的一个标准库,它提供了一套通用的数据结构和算法,以支持高效的编程。STL的设计目标是使程序员能够以简洁、高效和可复用的方式开发代码。// 输出vector的大小return 0;https://blog.csdn.net/m0_62338174/article/details/135573281?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22135573281%22%2C%22source%22%3A%22m0_62338174%22%7D

1、简介

 C++ 是一种功能强大的编程语言,它一直在不断发展和演进。自从 C++11 标准发布以来,C++ 引入了许多重要的新特性,如智能指针、Lambda 表达式、右值引用等。随后的 C++14 和 C++17 标准也带来了更多的改进和增强。本篇博客将详细介绍 C++ 新标准引入的一些重要特性,并给出代码示例和详细解释,帮助读者了解和应用这些特性。

2.自动类型推导和初始化

C++11 引入了 auto 关键字和统一的初始化语法,使得变量的类型推导更加方便。在 C++11 之前,我们必须手动指定变量的类型,例如 int、double 等。但是在某些情况下,类型可能比较复杂或者难以确定,使用 auto 关键字可以自动推导出变量的类型。同时,C++11 还引入了统一的初始化语法,允许我们使用初始化列表对变量进行初始化,这样代码更加简洁和易读。

示例代码

auto x = 10; // x 的类型被推导为 int
auto y = 3.14; // y 的类型被推导为 double

std::vector<int> nums = {1, 2, 3}; // 使用初始化列表进行初始化

3.智能指针

C++11 引入了智能指针,用于管理动态分配的内存,避免内存泄漏和悬空指针的问题。其中最常用的是 shared_ptr 和 unique_ptr。shared_ptr 允许多个指针共享同一个对象,并且会自动进行内存回收,直到所有指针都不再需要该对象。unique_ptr 则保证每个对象只有一个指针拥有它,可以通过 std::move 函数实现所有权的转移。

示例代码

std::shared_ptr<int> p1 = std::make_shared<int>(10); // 使用 make_shared 创建 shared_ptr
std::unique_ptr<int> p2(new int(20)); // 使用 new 创建 unique_ptr

if (p1) {
    std::cout << *p1 << std::endl; // 访问指针指向的值
}

4.Lambda 表达式

C++11 引入了 Lambda 表达式,允许我们在代码中定义匿名函数,简化了函数对象的使用和编写。Lambda 表达式的基本形式为 [ capture-list ] ( params ) mutable exception -> return-type { body },其中 capture-list 表示变量捕获列表,params 表示参数列表,mutable 和 exception 表示是否可变和异常规范,return-type 表示返回类型,body 表示函数体。

示例代码

std::vector<int> nums = {1, 2, 3, 4, 5};

// 使用 Lambda 表达式对容器进行遍历和操作
std::for_each(nums.begin(), nums.end(), [](int n) {
    std::cout << n * 2 << " ";
});

5.右值引用和移动语义

C++11 引入了右值引用和移动语义,通过 std::move 函数实现对资源的高效转移,提高了性能和效率。右值引用用 && 表示,可以绑定到临时对象、表达式、返回右值引用的函数等,允许我们对这些对象进行高效的转移和管理。移动语义则是指通过右值引用实现资源的转移,避免了复制和销毁的开销。

示例代码

std::string str = "Hello";
std::vector<std::string> vec;

vec.push_back(std::move(str)); // 使用 std::move 转移资源

std::cout << str << std::endl; // 输出为空,str 的资源已被转移

6.并发编程支持

C++11 引入了一套完整的并发编程库,包括原子操作、线程、互斥量、条件变量等,方便开发者进行多线程编程和并发控制。其中最常用的就是 std::thread 类和 std::mutex 类。std::thread 可以创建新的线程,并执行指定的函数或 Lambda 表达式,std::mutex 则可以保护共享资源,避免多个线程同时访问和修改同一个变量。

示例代码

std::mutex mtx;
int count = 0;

std::vector<std::thread> threads;

for (int i = 0; i < 10; ++i) {
    threads.emplace_back([&]() {
        std::lock_guard<std::mutex> lock(mtx); // 使用互斥量保护共享资源
        count++;
    });
}

for (auto& thread : threads) {
    thread.join();
}

std::cout << "count: " << count << std::endl;

7.其他特性

C++14 和 C++17 标准引入了更多的改进和增强,如通用 lambda、变长模板、constexpr 函数、初始化列表等。通用 lambda 允许我们对任意类型的参数进行操作,变长模板则可以支持任意数量和任意类型的模板参数,constexpr 函数可以在编译时计算结果,初始化列表则可以方便地对复杂对象进行初始化。

八、案例:实现一个简单的并发下载器

#include <iostream>
#include <vector>
#include <thread>
#include <mutex>

std::mutex mtx;

void downloadFile(const std::string& url, const std::string& filename) {
    // 模拟下载文件的耗时操作
    std::this_thread::sleep_for(std::chrono::seconds(2));

    // 使用互斥量保护共享资源
    std::lock_guard<std::mutex> lock(mtx);
    std::cout << "Downloaded file: " << url << " saved as: " << filename << std::endl;
}

int main() {
    std::vector<std::string> urls = {
        "http://example.com/file1.txt",
        "http://example.com/file2.txt",
        "http://example.com/file3.txt"
    };

    std::vector<std::thread> threads;

    for (const auto& url : urls) {
        threads.emplace_back([&]() {
            // 生成文件名
            std::string filename = "file_" + std::to_string(std::hash<std::string>()(url)) + ".txt";
            downloadFile(url, filename);
        });
    }

    for (auto& thread : threads) {
        thread.join();
    }

    return 0;
}

具体而言,程序首先定义了一个包含多个 URL 的 std::vector 对象 urls,这些 URL 表示需要下载的文件地址。然后我们创建了一个 std::vector 对象 threads,用于存储多个线程对象。接着我们使用 for 循环遍历 urls,每次循环都会创建一个新的线程,并将其加入到 threads 中。每个线程都会调用 downloadFile 函数进行文件下载,同时生成一个唯一的文件名。

downloadFile 函数模拟了文件下载的耗时操作,具体而言,我们使用了 std::this_thread::sleep_for 函数,让线程休眠 2 秒钟,模拟文件下载的过程。在函数结束之前,我们使用 std::lock_guardstd::mutex 对共享资源进行了保护,确保每个线程都能够正确地输出下载完成的信息。

以上是一个简单的并发下载器示例。我们使用了 C++11 的并发编程支持,通过创建多个线程并发地下载多个文件。每个线程都会调用 downloadFile 函数进行文件下载,而该函数会使用互斥量保护共享资源,避免多个线程同时访问和修改同一个文件。

通过这个案例,我们可以看到 C++11 的并发编程支持非常强大,可以方便地实现多线程的应用程序,提高程序的性能和效率。同时,使用互斥量等工具可以保证多线程的安全性,避免竞态条件和数据竞争的问题。

C++学习笔记——C++ 新标准(C++11、C++14、C++17)引入的重要特性,C++的学习笔记,c++,学习,笔记文章来源地址https://www.toymoban.com/news/detail-803766.html

到了这里,关于C++学习笔记——C++ 新标准(C++11、C++14、C++17)引入的重要特性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++学习】C++11——新特性 | 右值引用 | 完美转发

    🐱作者:一只大喵咪1201 🐱专栏:《C++学习》 🔥格言: 你只管努力,剩下的交给时间! C++的发展截至到目前为止,虽然版本有很多,但是C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一

    2024年02月06日
    浏览(23)
  • 【C++学习笔记】对象的特性

    浅拷贝:简单的赋值拷贝操作 深拷贝:在堆区重新申请空间,进行拷贝 利用编译器提供的拷贝构造函数,会做浅拷贝操作;会导致堆区的内存重复释放 ![[Pasted image 20221216213144.png]] 解决方法: 利用深拷贝进行解决。 语法: 构造函数():属性1(值1),属性2(值2),...{} ![[Pasted im

    2023年04月26日
    浏览(17)
  • linux如何查看编译器支持的C++版本(支持C++11、支持C++14、支持C++17、支持C++20)(编译时不指定g++版本,默认使用老版本编译)

    C++11 C++11是一个重要的C++标准版本,于2011年发布。C++11带来了许多重要的改进,包括: 智能指针:引入了shared_ptr和unique_ptr等智能指针,用于更好地管理动态内存分配。 新的循环语句:引入了for循环中的范围语法,以更简洁的方式遍历容器。 初始化列表:允许使用初始化列表

    2024年02月02日
    浏览(28)
  • C++学习笔记之四(标准库、标准模板库、vector类)

    C + + C++ C + + 标准库指的是标准程序库( S t a n d a r d Standard St an d a r d L i b a r a y Libaray L iba r a y ),它定义了十个大类,其中包括我们比较熟悉的 i o s t r e a m , s t r i n g iostream, string i os t re am , s t r in g 都是这十个大类的其中一个类中的一个小类。而 c + + c++ c + + 的标准模板库也

    2024年02月07日
    浏览(25)
  • 【C++ 17 新特性 】拥抱现代C++:深入C++17特性以获得更高效、更安全的代码

    C++17是C++编程语言的一个重要版本,于2017年12月正式发布。它在C++11和C++14的基础上继续完善和扩展C++语言特性和标准库组件。C++17的主要目标是进一步提高C++程序的性能、可用性和安全性,同时引入一些新的编程范式,使C++编程更加现代化和高效。 C++17包含许多新特性,如

    2024年02月13日
    浏览(28)
  • JDK8,JDK11,JDK17,JDK21及中间版本主要更新特性

    官方地址: https://www.oracle.com/java/technologies/java-se-support-roadmap.html 从上图可以很清晰得可以看出,JDK7,JDK8,JDK11,JDK17,JDK21是长期维护的版本。从目前来看,JDK8到2023年已经有将近10年的历史了,大多数依据JDK8的相关技术内容已经很成熟了,但是大家也看到,JDK在不断地迭代,JD

    2024年02月21日
    浏览(44)
  • C++进阶语法——STL 标准模板库(下)(Standard Template Library)【学习笔记(七)】

    1、迭代器 迭代器可以将任意的容器抽象成一个序列,可以使用迭代器遍历容器中的元素 迭代器设计的目的是为了解决容器与算法之间的耦合问题,与指针类似,可以通过迭代器访问容器中的元素 迭代器的声明方式为: 容器类型::iterator 变量名称 , 可以理解为一个普通的指

    2024年02月06日
    浏览(36)
  • JDK8、JDK11、JDK17和JDK21这几个版本更新的主要特性

    JDK8 是 Java 的一个重大更新版本,引入了一系列新特性和改进,主要包括: Lambda 表达式: Lambda 表达式允许我们以简洁、函数式的方式编写代码,使代码更易于理解和维护。- Stream API : Stream API 提供了一套声明式处理数据的方式,使得对集合和数组的操作更加直观和高效。

    2024年04月29日
    浏览(35)
  • 【C++】C++11特性

    1.1 {}初始化 C++11引入了初始化列表(Initializer lists)的特性,通过花括号 {} 可以方便地初始化数组、容器和自定义类型的成员变量。这种语法可以一次性地指定多个初始值,而不需要显式地编写多个赋值语句。 下面是一些示例用法: 初始化数组: 初始化容器(如std::vector)

    2024年02月16日
    浏览(25)
  • C++ 11新特性之并发

    概述         随着计算机硬件的发展,多核处理器已经成为主流,对程序并发执行能力的需求日益增长。C++ 11标准引入了一套全面且强大的并发编程支持库,为开发者提供了一个安全、高效地利用多核CPU资源进行并行计算的新框架,极大地简化了多线程开发。 std::thread  

    2024年02月20日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包