Effective Mordern C++
文章平均质量分 87
对于现代C++的学习和思考
七夜落幕丶
这个作者很懒,什么都没留下…
展开
-
Effective Mordern C++和现代C++的探索
导言现代C++学起来难度稍微大一点,需要更多的精力去查漏补缺,很高兴在2018年,我接触到了许多之前没想过的东西,也谢谢周围的人给我带来的动力。这篇读书笔记将涵盖现代C++(包括C++11和C++14)的部分内容,从《Effective Mordern C++》这本书读到和想到的内容。目录第1章 型别推导 第2章 auto 第3章 转向现代C++ 第4章 智能指针 第5章 ...原创 2018-06-10 18:34:52 · 893 阅读 · 0 评论 -
第一章 型别推导
第一章 型别推导一 理解模板型别推导函数模板类型如下:template <typename T>void f(ParamType param); //ParamType是一个T相关的类型f(expr); //推导T和ParamType的型别ParamType有三种类型:ParamType是个指针或引用,但不是万能引用ParamType是万能引...原创 2018-06-10 18:36:32 · 507 阅读 · 0 评论 -
第二章 auto
五 优先选用auto,而非显示型别声明C++11中的auto可以用来声明变量,其型别都是推导自其初始化产物,所以必须进行初始化,这样可以保证合法初始化。int x; //未进行初始化,编译没有问题,但后续可能有逻辑问题auto x; //未进行初始化,无法通过编译其次可以去掉提领迭代器来声明局部变量时写的超复杂代码://C++0xtemplate<typename T...原创 2018-06-10 19:04:28 · 290 阅读 · 0 评论 -
第三章 转向现代C++
七 在创建对象时注意区分()和{}C++11中多了一种初始化的方式,就是通过{}来进行初始化,例如初始化一个int类型int x(0);int y = 0;int z{0};int z = {0};使用大括号初始化容器非常方便:vector<int> vec{1,2,3};大括号同样可以用来初始化类内非静态成员变量,当然也可以用=初始化,但不可以用()...原创 2018-07-04 19:06:07 · 1020 阅读 · 0 评论 -
第四章 智能指针
智能指针裸指针问题如下:裸指针在声明中并未指出,裸指针指涉到的是单个对象还是一个数组。裸指针在声明中也没有提示是不是要对其进行虚构。换言之,无法得知指针是否拥有其指涉的对象。或者是否空悬指针的析构是不是拥有重载的delete操作符。要防止多于一次的释放和析构。C++存在的4种智能指针: std boost 功能说明 auto_ptr(C++98)...原创 2018-07-09 15:36:09 · 574 阅读 · 1 评论 -
第五章 右值引用、移动语义和完美转发
移动语义使得编译器可以将一些代价高昂的复制操作转移成移动操作。例如STL中的很多复制操作。移动构造函数和移动赋值运算符可以使用移动语义,创建只移对象成为可能,例如shared_ptr、unique_ptr和thread等等。完美转发使得人们可以撰写接受任何实参的模板函数,并将其转发到其他函数,目标函数会接受到与转发函数所接受的完全相同的实例。二十三 理解std::move和std::for...原创 2018-07-12 15:07:29 · 798 阅读 · 1 评论 -
第六章 lambda表达式
lambda表达式是表达式的一种,它是源代码的组成部分。std::find_if(container.begin(), contianer.end(), [](int val){ return 0 < val; });闭包是lambda表达式创建的运行期对象,根据不同的捕获模式,闭包会持有数据的副本或者引用。闭包类就是实例化闭包的类,每个lambda式都会出发编译器生成一个独一无...原创 2018-07-15 21:48:48 · 777 阅读 · 0 评论 -
第七章 并发API
C++11将并发融入了语言和库中。三十五 优先选用基于任务而非基于线程的程序设计基于线程的设计就是使用std::thread来运行函数;基于任务的设计就是使用std::async来运行函数。int f();thread(f); //基于线程auto r = async(f); //基于任务使用async调用f的时候,传递给async的函数对象被看做是任务。在基于线程的调...原创 2018-07-18 16:36:46 · 517 阅读 · 0 评论 -
第八章 微调
四十一 针对可复制的形参,在移动成本低并且一定会被复制的前提下,考虑将其按值传递当构造函数需要对左值和右值进行分别处理的时候,我们有两种方法,一种是重载接受左值和右值的构造函数,另一种是写万能引用构造函数,这两种方法都有一定的局限性,左值右值重载构造函数会导致代码的冗余,而万能引用会匹配一些错误的类型。有一种新的方式,就是使用按值传递,函数内部将局部变量强转为右值进行移动构造。代码如下:...原创 2018-07-19 13:41:05 · 292 阅读 · 0 评论