C++11新特性深入剖析
文章平均质量分 65
C++ 11
优惠券已抵扣
余额抵扣
还需支付
¥29.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
奇妙之二进制
csdn博客专家,C/C++领域优质创作者,抖音搜奇妙之二进制,专注于Linux C/C++、嵌入式Linux开发,偶尔谈谈人生,目前致力于完成大约500篇的linux C/C++开发知识体系库,所有的文章都会一直保持更新(优化内容、排版),想学习的可以订阅我的专栏,也可以关注Linux 世界。
展开
-
全网精华之C++11 60篇链接汇总
整理得比较完整的一个C++11系列教程,遵循由浅到深的编排顺序,并且做了大量上机验证和堪误,以及语病和语义通顺修改,呕心沥血,增删改查1年多时间才完成,汇聚csdn、博客园、Google搜索、百度搜索等全网精华,在此奉献给各位爱好C++、被迫学习C++的网友,欢迎文章下方留言评论,指出纰漏。C++11 系列文章C++11(0)10个开始使用 C++11 的理由C++11(1) 原生字符串C++11(2) 新增基本数据类型std::nullptr_t以及关于C/C++中NULL、nullptr对比原创 2021-05-22 00:37:51 · 4822 阅读 · 1 评论 -
C++11 std::find的使用(普通类型和自定义类型)
# include <algorithm>template< class InputIt, class T >InputIt find( InputIt first, InputIt last, const T& value );在传入的区间[first, last) 内查找值等于value的元素,找到则返回指向该元素的迭代器,没有则返回last,其实现大致类似于:template<class InputIt, class T>constexpr In原创 2021-03-14 12:56:11 · 3048 阅读 · 1 评论 -
C++11 锁的加强版封装unique_lock
unique_lock是一个通用的互迟锁包装类,它允许延迟锁定,限时尝试加锁,递归锁定,锁定所有权的转移以及与条件变量一起使用。简单地讲,unique_lock 是 lock_guard 的升级加强版,它具有 lock_guard 的所有功能,同时又具有其他很多方法,使用起来更强灵活方便,能够应对更复杂的锁定需要。特点如下:创建后默认锁定,和lock_guard创建时可以不锁定(通过指定第二个参数为std::defer_lock),而在需要时再锁定。defer_lock表示延时加锁的意思.转载 2021-01-25 11:50:58 · 2336 阅读 · 2 评论 -
C++11 10个开始使用 C++11 的理由
这篇文章的时间比较久了,C++11在国内基本得到了普及,下一个被普及的标准是C++20。如果你的代码工作正常并且表现良好,你可能会想知道为什么还要使用C++ 11。当然了,使用用最新的技术感觉很好,但是事实上它是否值得呢?在我看来,答案毫无疑问是肯定的。我在下面给出了9个理由,它们分为两类:性能优势和开发效率。获得性能优势**理由1:**move语义(move semantics)。简单的说,它是优化复制的一种方式。有时候复制很显然是浪费的。如果你从一个临时的string对象复制内容,简单的复制指针原创 2021-04-10 15:45:56 · 4306 阅读 · 3 评论 -
C++11 原生字符串
1、原生字符串定义C/C++中提供了字符串,字符串支持转义,在某些时候给我们提供了便利,比如换行符\n,制表符\t。但在我们不需要的时候又成了麻烦,如果需要原生义的时候,需要反转义,比较麻烦。C++提供了,原生字符串,即字符串中无转义,亦无需再反义。原生字符串的准确定义应该是:R"自定义分隔符(字符串)自定义分隔符"前后两处自定义分隔符必须一致,可以省略,所以我们看到的一般原生字符串为:std::string word = R"(hello world)";提供自定义分隔符的用意为,当你的字原创 2021-03-14 17:21:13 · 2772 阅读 · 2 评论 -
C++11 智能指针使用陷阱--编程经验
智能指针都是 值语意,要么是栈上对象,或者是其他对象的直接数据成员,或者是标准库容器的元素,几乎不会出现下面的用法:std::shared_ptr<Foo> p* = new shared_ptr<Foo>(new Foo);不要将其他的智能指针所指向的对象的地址值传给reset() 或者去生成一个新的智能指针对象,这种代码可能会通过编译,但是肯定会让程序崩溃不能像对原生指针那样,对智能指针进行一些自减和自增操作智能指针只能用来保存堆上分配的内存的地址 .原创 2021-04-11 13:26:20 · 2938 阅读 · 0 评论 -
C++11新特性之列表初始化
文章目录**1、统一的初始化方法****2、列表初始化的一些使用细节****3、初始化列表****4、列表初始化防止类型收窄**在我们实际编程中,我们经常会碰到变量初始化的问题,对于不同的变量初始化的手段多种多样,比如说对于一个数组我们可以使用 int arr[] = {1,2,3}的方式初始化,又比如对于一个简单的结构体:struct A{ int x; int y;}a = {1,2};这些不同的初始化方法都有各自的适用范围和作用,且对于类来说不能用这种初始化的方法,最主要的是没有一种可转载 2021-11-20 23:54:09 · 8670 阅读 · 0 评论 -
C++11 override防止未重写虚函数或者未正确重写
override保留字用于修饰子类中重写的虚函数,表示当前子类重写了基类的虚函数。:在类的成员函数参数列表后面添加该关键字既可。原创 2020-12-06 17:51:21 · 17492 阅读 · 3 评论 -
C++11之模板别名&函数模板的默认模板参数
文章目录**1、模板别名****2、函数的默认模板参数**1、模板别名在C++98/03里,我们可以通过typedef 关键字定义一个类型的别名,比如 typedef unsigned int uint_t;在这里我们定义了unsigned int类型的别名和uint_t,在以后需要使用unsigned int的时候我们都可以用uint_t替换,但是uint_t仅仅是作为unsigned int的一个别名,如下的定义是不合法的:typedef unsigned int uint_t;void fu转载 2021-11-21 00:21:31 · 7378 阅读 · 0 评论 -
C++11 新增基本数据类型std::nullptr_t以及关于C/C++中NULL、nullptr对比
文章目录一、C程序中的NULL是(void *)0二、C++中的NULL其实是0三、C++11 引入nullptr在编写C程序的时候只看到过NULL,而在C++的编程中,我们可以看到NULL和nullptr两种关键字,其实nullptr是C++11版本中新加入的,它的出现是为了解决NULL表示空指针在C++中具有二义性的问题。一、C程序中的NULL是(void *)0在C语言中,NULL通常被定义为:#define NULL ((void *)0)所以说NULL实际上是一个空指针,如果在C语言中写入原创 2021-03-20 23:00:03 · 11498 阅读 · 2 评论 -
C++11 constexpr编译时期计算
文章目录1.constexpr初探2.constexpr修饰函数的限制3.使用编译时对象4.constexpr vs const的区别翻译自:https://www.cprogramming.com/c++11/c++11-compile-time-processing-with-constexpr.htmlC++11为了提高代码执行效率做了一些改善。这种改善之一就是:生成常量表达式,允许程序利用编译时的计算能力。假如你熟悉模板元编程,你将发现constexpr使这一切变得更加简单。constexpr使原创 2021-04-04 22:45:40 · 2751 阅读 · 3 评论 -
C++编程法则365条一天一条(364)auto自动推导随C++版本的进化
综述auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型,类似的关键字还有decltype。举个例子: int a = 10; auto au_a = a;//自动类型推断,au_a为int类型 cout << typeid(au_a).name() << endl;typeid运算符可以输出变量的类型。程序的运行结果输出了int**auto的自动类型推断发生在编译期,所以使用auto并不会造成程序运行时效率的降低。**而是原创 2020-12-05 16:07:57 · 2415 阅读 · 4 评论 -
C++编程法则365天一天一条(199) 数组、容器遍历的高级写法--基于范围的for循环
本文为转载,博主作了校对和批注。熟悉C++98/03的对于for循环就再了解不过了,如果我们要遍历一个数组,那么在C++98/03中的实现方式:int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int i = 0; i < 10; i++) cout << arr[i]; 而遍历容器类的For如下:std::vector<int> vec {1,2,3,4,5,6,7,8,9,10}; for转载 2020-12-05 15:36:34 · 2179 阅读 · 4 评论 -
C++11、17 auto结合基于范围的for循环map和vector两种常用容器遍历写法小记
上面for循环的推导变量item取first和second元素的时候使用的是“.”操作符,而不是“->”操作符,是因为item不是迭代器类型的。auto自动推导出的类型是容器中的value_type,而不是迭代器。C++17开始支持key binding,原创 2020-12-05 17:05:20 · 17910 阅读 · 5 评论 -
C++11 default和delete的使用
在C++中,声明自定义的类型之后,编译器会默认生成一些成员函数,这些函数被称为默认函数。其中包括(1)(默认)构造函数(2)拷贝(复制)构造函数(3)拷贝(复制)赋值运算符(4)移动构造函数(5)移动赋值运算符(6)析构函数另外,编译器还会默认生成一些操作符函数,包括(7)operator ,(8)operator &(9)operator &&(10)operator *(11)operator ->(12)operator ->*(13)o原创 2021-04-10 13:16:23 · 4682 阅读 · 2 评论 -
C++11 explicit关键字禁用单参数构造函数的隐式转换
C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色。1 是个构造器 ,2 是个默认且隐含的类型转换操作符。所以, 有时候在我们写下如 AAA = XXX, 这样的代码, 且恰好XXX的类型正好是AAA单参数构造器的参数类型, 这时候编译器就自动调用这个构造器, 创建一个AAA的对象。这样看起来好象很酷, 很方便。 但在某些情况下(见其他文章为何要禁用隐式转换), 却违背了我们(程序员)的本意。 这时候就要在这个构造函数前面加上explicit修饰,原创 2020-12-01 23:05:20 · 17781 阅读 · 2 评论 -
C++11 为什么auto类型说明符会忽略顶层const
假如某个函数返回类型 const T,形如:const T SomeFunction();你很可能希望有一个可变的变量接收这个值:auto t = SomeFunction();t.Modify();反过来,你也有时会希望把一个可变的值变成const引用vector<T> container;for (const auto& t : container)…所以最顶层那个const经常会根据需要变化。如果没有这个feature会不那么方便。...原创 2020-12-18 00:28:05 · 17207 阅读 · 4 评论 -
C++11 为何要禁用构造函数的隐式转换(explicit)
按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示:class String {String(const char* p ); // 用C风格的字符串p作为初始化值}String s1 = “hello”; //OK 隐式转换,等价于String s1 = String(“hello”);但是有的时候可能会不需要这种隐式转换,如下:class String { String ( int n ); //本意是预先分配原创 2020-12-01 23:10:48 · 18176 阅读 · 2 评论 -
C++11 强类型枚举和普通枚举
(1)强作用域,强类型枚举成员的名称不会被输出到其父作用域,所以不同枚举类型定义同名枚举成员编译不会报重定义错误。C++标准规定C++枚举所基于的“基础类型”是由编译器来具体实现,这会导致枚举类型成员的基本类型存在不确定性问题,尤其是符号性问题,即。(2)由于强类型枚举是强类型作用域的,故匿名的enum class可能什么都做不了,但是匿名强类型枚举我在visu studio 2019 上编译报错,提示。传统枚举类型为了配合C++11引入的强类型枚举,C++11对传统枚举类型进行了扩展。原创 2021-03-14 18:01:47 · 2240 阅读 · 1 评论 -
C++11 mutable关键字打破const成员函数不可修改成员变量的特性
mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。在C++中,mutable也是为了突破const成员函数的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。我们知道,被const关键字修饰的函数的一个重要作用就是为了能够保护类中的成员变量。即:该函数可以使用类中的所有成员变量,但是不能修改他们的值。然而,在某些特殊情况下,我们还是需要在const函数中修改类的某些成员变量,因为要修改的成员变量与类本身并无多少关原创 2020-12-04 00:12:02 · 17466 阅读 · 2 评论 -
C++11 可调用对象包装器--std::function使用
文章目录1. std::function介绍2. std::function的原型3. std::function的用法4. std::function使用注意事项5.std::function结合typedef定义函数类型--回调应用6. std::bind 介绍1. std::function介绍std::function本质是一种类模板,是对通用、多态的函数封装。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式、函原创 2020-12-05 17:46:19 · 16237 阅读 · 3 评论 -
C++11 std::bind函数绑定
文章目录概念和原理普通函数的绑定占位符引入成员函数绑定概念和原理可将std::bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。std::bind将可调用对象与其参数一起进行绑定,绑定后的结果可以使用std::function保存。std::bind主要有以下两个作用:将可调用对象和其参数绑定成一个防函数;只绑定部分参数,减少可调用对象传入的参数。bind接受的第一个参数必须是一个可调用的对象f,可以是函数、函数指针、函数对象和成员原创 2020-12-06 01:14:38 · 3612 阅读 · 3 评论 -
C++11 lambda匿名函数看这一篇足以
lambda 源自希腊字母表中第 11 位的 λ,在计算机科学领域,它则是被用来表示一种匿名函数。所谓匿名函数,简单地理解就是没有名称的函数,又常被称为 lambda 函数或者 lambda 表达式。继 Python、Java、C#、PHP 等众多高级编程语言都支持 lambda 匿名函数后,C++11 标准终于引入了 lambda,本节将带领大家系统地学习 lambda 表达式的具体用法。lambda匿名函数的定义定义一个 lambda 匿名函数很简单,可以套用如下的语法格式:[外部变量访问方式说原创 2021-03-14 17:38:06 · 14730 阅读 · 3 评论 -
C++11 lamba表达式的优越性体现在哪
优越性比较应该是和C++原本的函数、函数对象(重载operator()的struct)做对比的。其实lambda本质也就是之前的函数对象,但是由于lambda是C++11的语法扩充,而非库的扩充。它其实有着之前函数或者函数对象所不能比拟的一些优势。首先,大家都知道的:它能够在需要使用的时候定义,而无需跳出当前函数,在函数外重新定义一个函数或者struct。你或许会觉得这是一个微不足道的语法糖。其次,大家未必知道的:其实lambda还有一个优势,就是定义时立即执行。[]() { //....}原创 2021-05-22 22:48:12 · 3481 阅读 · 0 评论 -
C++11 lamba表达式小细节
如果lamba表达式没有捕获任何变量,则可以转换为一个普通的函数指针:// Example program#include <iostream>#include <string>int main(){ int a = 11; auto f = [](int) { std::cout << "hello world";}; void (*fptr)(int) = f; (*fptr)(a);}...原创 2021-05-22 23:53:34 · 2924 阅读 · 0 评论 -
C++11 lambda函数对象中的静态变量如何工作
你是否思考过这个问题?原创 2021-03-14 17:57:39 · 2193 阅读 · 0 评论 -
C++11 Lambda 表达式中值传递引入mutable
待编辑https://www.zhihu.com/question/64969053/answer/226383958原创 2020-12-04 00:18:21 · 2328 阅读 · 0 评论 -
C++11 使用std::function和std::bind实现类A的成员函数注册为类B的回调
这是个实际开发经常遇到的设计。类B实现某一功能,类A采用组合的方式,将类B作为其成员以图获取B的能力。类B提供了注册回调的接口给类A,在类B完成某项功能的时候可以调用A的接口,完成A自己的处理工作或者需求。// This program uses a function template.#include <iostream>#include <functional>#include <thread>#include <string>#include原创 2020-12-06 01:39:35 · 17123 阅读 · 4 评论 -
C++11 关于右值引用(Rvalue reference)特性的深入探讨
xxx原创 2021-04-01 00:22:55 · 1759 阅读 · 4 评论 -
C++11 移动语义与移动构造
当使用 get_demo() 函数返回的临时对象初始化 a 时,我们只需要将临时对象的 num 指针直接浅拷贝给 a.num,然后修改该临时对象中 num 指针的指向(通常另其指向 NULL),这样就完成了 a.num 的初始化。当然,对于仅申请少量堆空间的临时对象来说,深拷贝的执行效率依旧可以接受,但如果临时对象中的指针成员申请了大量的堆空间,那么 2 次深拷贝操作势必会影响 a 对象初始化的执行效率。事实上,对于程序执行过程中产生的临时对象,往往只用于传递数据(没有其它的用处),并且会很快会被销毁。原创 2020-12-06 14:11:33 · 1346 阅读 · 2 评论 -
C++11 std::move将左值强制转换为右值
通过学习 《C++11 移动语义与移动构造》一节我们知道,C++11 标准中借助右值引用可以为指定类添加移动构造函数,这样当使用该类的右值对象(可以理解为临时对象)初始化同类对象时,编译器会优先选择移动构造函数。注意,移动构造函数的调用时机是:用同类的右值对象初始化新对象。那么,用当前类的左值对象(有名称,能获取其存储地址的实例对象)初始化同类对象时,是否就无法调用移动构造函数了呢?当然不是,C++11 标准中已经给出了解决方案,即调用 move() 函数。move 本意为 “移动”,但该函数并不能移动原创 2021-05-23 20:38:42 · 5488 阅读 · 0 评论 -
C++编程法则365天一天一条(302)std::ref引用包装器
std::ref和std::cref在函数式编程中的作用是非常大的,C++标准库中多次使用到了它们。而std::ref和std::cref事实上是模板函数,返回值是一个std::reference_wrapper对象,而std::reference_wrapper虽然是一个对象,可是他却能展现出和普通引用类似的效果,这点和前一篇文章讲的智能指针如出一辙(事实上标准库大多是这样设计的,这也是运算符重载存在的一个重要意义)。原创 2020-12-06 14:08:31 · 5864 阅读 · 1 评论 -
C++11 智能指针shared_ptr一篇足以
关于shared_ptr我可以写至少3篇内容。原创 2021-03-31 00:04:04 · 1800 阅读 · 3 评论 -
C++11 shared_ptr循环依赖引入的内存泄露问题
#include <memory>#include <iostream>class CB;class CA{public: CA() { std::cout << "CA() called! " << std::endl; } ~CA() { std::cout << "~CA() called! " << std::endl; } void set_ptr(std::shared_ptr<CB原创 2021-05-11 17:51:20 · 4361 阅读 · 1 评论 -
C++11 weak_ptr智能指针详解
weak_ptr这个指针天生一副“小弟”的模样,也是在C++11的时候引入的标准库,它的出现完全是为了弥补它老大shared_ptr天生有缺陷的问题,其实相比于上一代的智能指针auto_ptr来说,新进老大shared_ptr可以说近乎完美,但是通过引用计数实现的它,虽然解决了指针独占的问题,但也引来了引用成环的问题,这种问题靠它自己是没办法解决的,所以在C++11的时候将shared_ptr和weak_ptr一起引入了标准库,用来解决循环引用的问题。weak_ptr本身也是一个模板类,但是不能直接用它来定转载 2021-04-10 20:49:06 · 4796 阅读 · 7 评论 -
C++11 unique_ptr智能指针详解
文章目录0、应用场景1、初始化方式2、常用操作3、例子例子1 创建unique_ptr并以引用形式传递给函数例子2 用vector管理unique_ptr例子3 unique_ptr作为类成员时,如何初始化例子4 unique_ptr也支持make_unique构造3、注意传参和返回unique_ptr0、应用场景unique是唯一的意思,unique_ptr不像shared_ptr可以共享它所管理的指针,在我们将unique_ptr1赋值给unique_ptr2时,unique_ptr1的所管理的指针原创 2021-04-10 20:47:56 · 4040 阅读 · 1 评论 -
C++11 std::async的使用陷阱--为何我的异步操作并不异步
xxx原创 2021-03-30 15:22:16 · 3747 阅读 · 3 评论 -
C++11 std::async同步异步执行接口和std::future同步异步执行结果获取
template< class Function, class... Args>std::future<std::result_of_t<std::decay_t<Function>(std::decay_t<Args>...)>> async( Function&& f, Args&&... args );template< class Function, class... Args >原创 2021-03-28 22:48:58 · 2337 阅读 · 5 评论 -
C++11 写一个支持基于范围的for循环的类
String,array和所有的STL容器类都能被这种新的基于范围的for循环迭代。但是,如果你将新语法应用到你自定义的数据结构上呢?为了使一个数据具有可迭代性,他必须与STL迭代具有相似的工作属性。(1)具有begin和end方法,即可以作为成员函数也可以作为独立的函数,函数返回数据结构开始和结束的迭代器。(2)迭代器必须支持操作符*,!=,++,即可以作为成员函数也可作为独立函数(详细的信息可以参考操作符重载)。在这里请注意,++操作符必须是前缀的,它被声明为不带参数的operator函数。就转载 2021-03-16 00:27:07 · 11169 阅读 · 2 评论 -
C++11 变量类型获取typeid
文章目录1、typeid使用1) 原型:const char* name() const;2) 原型:bool before (const type_info& rhs) const;3) 原型:bool operator== (const type_info& rhs) const;4) 原型:bool operator!= (const type_info& rhs) const;2 、判断类型是否相等1) 内置类型的比较2) 类的比较3、type_info 类的声明1、typ转载 2021-03-21 13:17:54 · 14945 阅读 · 2 评论