深入理解/应用C++11
文章平均质量分 90
阅读《深入理解C++11》过程中进行记录,并对书中未介绍的部分内容进行补充介绍。
WizardtoH
做一个快乐的、优秀的码农
展开
-
《深入应用C++11》笔记-std::function和bind
上一篇:《深入理解C++11》笔记-Unicode编码支持和原生字符串字面量接下来的内容将会补充在《深入理解C++11》书中没有涉及的一些比较常用的特性,内容取自《深入应用C++11》。 在C++中,存在“可调用对象(Callable Objects)”这么一个概念。准确来说,可调用对象有如下几种定义:是一个函数指针。是一个具有operator()成员函数的类对象(仿函数)。是一个...原创 2018-08-02 18:58:54 · 1116 阅读 · 0 评论 -
《深入理解C++11》笔记--简介
学习C++11之前,先来了解一下C++的历史。1979年,Bjame Sgoustrup到了Bell实验室,开始从事将C改良为带类的C(C with classes)的工作,1983年该语言被正式命名为C++。自从C++被发明以来,它经历了3次主要的修订,每一次修订都为C++增加了新的特征并作了一些修改。第一次修订是在1985年,第二次修订是在1990年。第三次是C++的标准化,一直到1...原创 2018-06-03 13:35:37 · 812 阅读 · 0 评论 -
《深入理解C++11》笔记--兼容C99
就像上一篇文章说到,第一个C++标准是C++98,也就是在1998年推出,而2003年只是对一些缺陷进行了修复。而上一个最新的C标准C99是在1999年推出,因此C++11之前是不支持C99标准的,在C++11中加入了对C99的支持,包括以下内容:C99的预定义宏预定义标识符号__func___Pragma操作符不定参数宏定义以及__VA_ARGS__宽窄字符串连接C99的预定...原创 2018-06-03 16:44:45 · 859 阅读 · 1 评论 -
《深入理解C++11》笔记--扩展
上一篇:《深入理解C++11》笔记–兼容C99 本篇介绍第一章中间部分的内容。 这部分内容主要是对原有的一些关键字、类型、宏等进行了扩展。long long整型扩展的整形宏__cplusplus静态断言noexcept修饰符、noexcept操作符快速初始化成员变量非静态成员的sizeof扩展的friend语法final/override控制long long整型...原创 2018-06-06 23:19:37 · 1351 阅读 · 1 评论 -
《深入理解C++11》笔记--模板
上一篇:《深入理解C++11》笔记–扩展 本篇介绍第一章最后一部分内容,模板相关的扩展。模板函数的默认模板参数外部模板局部和匿名实参作为模板参数模板函数的默认模板参数 大家都了解函数可以拥有默认形参,并且模板类可以有默认的模板参数,现在C++11中模板函数也可以有默认的模板参数了。例如:template<typename T = int> // C++9...原创 2018-06-09 15:29:24 · 654 阅读 · 0 评论 -
《深入理解C++11》笔记–构造函数
上一篇:《深入理解C++11》笔记–模板 这篇文章介绍的了第三章中构造函数相关的内容。 继承构造函数 派生类的构造函数往往需要调用基类的构造函数,例如:class Base{public: Base(int a): i(a){}private: int i;};class Inherit:public Base{public: Inherit(i...原创 2018-06-16 13:31:01 · 773 阅读 · 0 评论 -
《深入理解C++11》笔记–右值引用:移动语义和完美转发
上一篇:《深入理解C++11》笔记–构造函数 这篇文章介绍的了第三章中右值引用相关的内容。在介绍该内容之前,会对一些相关问题进行解释,便于理解后面的内容。 指针成员和拷贝构造 当一个类中含有指针成员时,由于默认的拷贝构造函数只会进行浅拷贝,所以当我们写出一下代码时:class Base{public: Base():data(new int(0)){} //Base...原创 2018-06-17 19:59:34 · 5612 阅读 · 1 评论 -
《深入理解C++11》笔记–显式转换操作符
上一篇:《深入理解C++11》笔记–右值引用:移动语义和完美转发 本编继续介绍第三章中的内容,显式转换操作符。 在介绍显式转换操作符之前先讨论一下C++的隐式转换,我们都知道很多时候C++会自动对类型进行转换,很多时候会比较方便,但是也会有一些问题,例如下面的例子:class ExampleA{public: ExampleA(int a = 0):data(a) {}priv...原创 2018-06-18 21:10:00 · 588 阅读 · 0 评论 -
《深入理解C++11》笔记–列表初始化
上一篇:《深入理解C++11》笔记–显式转换操作符 本编继续介绍第三章中的内容:列表初始化。 原来C++可以铜鼓花括号{}对数组元素进行统一初始化。例如:int a[5] = {0};int b[5] = {1, 2, 3, 4, 5};但是自定义的类型无法使用这种列表初始化,例如vector就不行,而C++11扩展了对自定义类型列表初始化的支持。int a[5] = {0};...原创 2018-06-18 21:57:54 · 586 阅读 · 0 评论 -
《深入理解C++11》笔记–POD类型
上一篇:《深入理解C++11》笔记–列表初始化 本编继续介绍第三章的内容:POD类型,plain old data。Plain代表数据是普通类型,old代表能与C兼容支持memcpy、memset等函数。POD分为两个部分,trival(平凡的)和(s’tan’dard layout)标准布局的。平台的类或结构体必须满足以下的条件: - 平凡的默认构造函数和析构函数。只要是自己定义了函数...原创 2018-06-24 14:03:05 · 3947 阅读 · 0 评论 -
《深入理解C++11》笔记–非受限联合体
上一篇:《深入理解C++11》笔记–POD类型 本编继续介绍第三章的内容:非受限联合体。在这之前我们先回顾一下联合体的用法:union Example{ char c[4]; int i;};int main(){ Example example; example.c[0] = 0x04; example.c[1] = 0x03; exa...原创 2018-06-24 18:23:19 · 851 阅读 · 0 评论 -
《深入理解C++11》笔记-用户自定义字面量
上一篇:《深入理解C++11》笔记–非受限联合体 本篇继续介绍第三章的内容:用户自定义字面量。字面量是什么意思呢?例如:int a = 0; // a为变量,0为字面量自定义字面量就是我们自己规定一个字面量格式来作为一些值的定义,具体代码如下:class Example{public: Example(int i, int j):a(i), b(j){} int...原创 2018-06-24 22:45:10 · 811 阅读 · 2 评论 -
《深入理解C++11》笔记-内联名字空间
上一篇:《深入理解C++11》笔记-用户自定义字面量 名字空间或者是命名空间,大家应该都有所了解,最常用的就是C++标准的std名字空间。名字空间的作用是区别同名的全局成员,例如在两个头文件中声明了同名的函数,如果在其他地方同时包含了两个头文件,编译时就会报错。// test1.hvoid func();// test1.cppvoid func(){}// test2.hvoi...原创 2018-07-03 09:22:52 · 642 阅读 · 1 评论 -
《深入理解C++11》笔记-模板的别名、模板的SFINEA规则
上一篇:《深入理解C++11》笔记-内联名字空间 本篇是第三章最后的内容,介绍模板的别名和模板的SFINEA规则。模板的别名 C++11中定义别名除了typedef还可以使用using关键字:typedef unsigned int UINT;using uint = unsigned int;和typedef不同的是,模板的别名定义也能通过using来定义:templa...原创 2018-07-05 09:26:36 · 881 阅读 · 0 评论 -
《深入理解C++11》笔记-auto类型
上一篇:《深入理解C++11》笔记-模板的别名、模板的SFINEA规则 本篇开始介绍第四章的内容:auto类型。auto类型推导 我们在使用C++的时候,变量都需要声明类型:int、char等等,这就是所谓的静态类型语言。而有些语言则不同,他们不需要对变量声明明确的类型,例如Python、JS等,也就是所谓的动态类型语言。静态类型和动态类型的区别其实主要在于对变量进行类型检查的时间点:静态...原创 2018-07-07 13:26:27 · 634 阅读 · 0 评论 -
《深入理解C++11》笔记-decltype
上一篇:《深入理解C++11》笔记-auto类型 本篇将介绍decltype的用法。decltype与auto类似,也能进行类型推导,但是用法有一定的区别,decltype推导出的类型能作为类型声明变量:int main(){ int i = 1; decltype(i) j = 2; std::cout << typeid(j).name() &原创 2018-07-10 14:15:01 · 521 阅读 · 0 评论 -
《深入理解C++11》笔记-追踪返回类型
上一篇:《深入理解C++11》笔记-decltype 本篇将介绍C++11中的追踪返回类型。 我们先来看一个问题:如果一个函数模板的返回值类型需要依赖于入参的类型,应该怎么写这个模板函数?在上一篇中介绍了decltype的用法,也许可以这样写:template<typename T>decltype(2 * a) doubleValue(T& a) { retur...原创 2018-07-10 16:49:02 · 737 阅读 · 0 评论 -
《深入理解C++11》笔记-基于范围的for循环
上一篇:《深入理解C++11》笔记-追踪返回类型 本篇介绍的是第四章最后一部分内容:基于范围的for循环。for循环大家应该都很熟悉,在C++模板中也有for_each来实现循环的方法:void action(int& e) { std::cout << e << std::endl; };int main(){ int arr[5]原创 2018-07-10 19:32:58 · 551 阅读 · 0 评论 -
《深入理解C++11》笔记-强类型枚举
上一篇:《深入理解C++11》笔记-基于范围的for循环 本篇开始介绍第五章的内容:强类型枚举。 枚举enum的使用应该十分常见,用于定义同一类的数据。但是枚举其实存在一定的问题:enum Male { Name, Age, Birthday};enum Female { Name, Age, Birthday};如上代码,如果两个枚举中定义了相同名称的枚举...原创 2018-07-12 10:38:02 · 665 阅读 · 0 评论 -
《深入理解C++11》笔记-智能指针unique_ptr、shared_ptr、weak_ptr
上一篇:《深入理解C++11》笔记-强类型枚举 本篇介绍C++11中新增的智能指针:unique_ptr、shared_ptr、weak_ptr。使用智能指针可以免于我们去主动管理内存,智能指针会自动释放内存:class Example {public: Example() { std::cout << "Example()&a原创 2018-07-12 18:37:00 · 793 阅读 · 0 评论 -
《深入理解C++11》笔记-常量表达式
size_t r_fib(size_t n) noexcept{ if (n == 0) return 0; if (n == 1) return 1; return r_fib(n - 1) + r_fib(n - 2);}constexpr size_t c_fib(size_t n) noexcept{ return n == 1 ? 1 : (n ...原创 2018-07-15 16:51:58 · 733 阅读 · 0 评论 -
《深入理解C++11》笔记-变长模板
上一篇:《深入理解C++11》笔记-常量表达式 本篇将介绍C++11中的变长模板,在这之前我们先回顾一下变长函数。变长函数、变长宏原来C++支持变长函数以及变长宏,能接收任何长度的参数列表:// 变长函数long sum(unsigned int count, ...){ va_list var; long sum = 0; va_start(var,...原创 2018-07-17 09:23:28 · 1297 阅读 · 0 评论 -
《深入理解C++11》笔记-原子类型和原子操作
上一篇:《深入理解C++11》笔记-变长模板 原子操作就是在多线程程序中”最小的且不可并行化的”操作,意味着多个线程访问同一个资源时,有且仅有一个线程能对资源进行操作。通常情况下原子操作可以通过互斥的访问方式来保证,例如Linux下的互斥锁,Windows下的临界区等。下面让我们看个例子:long long total = 0;void func(){ for (long...原创 2018-07-21 10:56:32 · 9699 阅读 · 4 评论 -
《深入理解C++11》笔记-指针空指nullptr
上一篇:《深入理解C++11》笔记-原子类型和原子操作 本篇开始结束第7章的内容:指针空值nullptr。nullptr、NULL和0在C++11之前对指针变量初始化的典型做法是将其指向一个空的位置,比如0、NULL。这是由于大多数计算机系统不允许用户程序写地址为0的内存地址,如果程序对该地址进行赋值,通常会引起程序异常。一般情况下,这样做没有问题,但是有时候会遇到有些麻烦:vo...原创 2018-07-23 11:52:50 · 936 阅读 · 0 评论 -
《深入理解C++11》笔记-默认函数的控制
在C++中声明自定义的类之后,编译器会默认生成一些成员函数,这些函数被称为默认函数。包括构造函数、拷贝构造函数、拷贝赋值构造函数、移动构造函数、移动拷贝函数、析构函数。另外,编译器还会默认生成一些操作符函数,包括operator ,、operator &、operator &&、operator 、operator ->、operator -&原创 2018-07-23 16:46:31 · 688 阅读 · 0 评论 -
《深入理解C++11》笔记-lambda函数
上一篇:《深入理解C++11》笔记-默认函数的控制lambda函数lambda函数是什么?还是直接看代码比较容易理解:int main(){ int a = 1; int b = 2; // 定义一个lambda函数 auto sum = [](int x, int y)->int{ return x + y; }; ...原创 2018-07-26 23:08:01 · 1014 阅读 · 1 评论 -
《深入理解C++11》笔记-对齐支持和通用属性
上一篇:《深入理解C++11》笔记-lambda函数本篇介绍的内容都是提升程序运行效率相关的内容,但是使用不当有可能会对程序的稳定性造成影响或者反而使效率下降,因此使用前要有充分的了解和把握。对齐支持alignof和alignas我们都知道结构体数据会进行字节对齐以保证运行效率,再让我们回顾一下具体的原因。一、什么是字节对齐 现代计算机中,内存空间按照字节划分,理论上可以...原创 2018-07-30 21:27:04 · 1066 阅读 · 1 评论 -
《深入理解C++11》笔记-Unicode编码支持和原生字符串字面量
std::codecvt std::wstring_convert std::locale原创 2018-08-01 23:00:13 · 1845 阅读 · 0 评论 -
《深入应用C++11》笔记-线程std::thread
上一篇:《深入应用C++11》笔记-std::function和bind原来开发多线程在windows和linux各有各的接口,C++ 11有了标准的线程库:std::thread。std::thread定义了四个构造函数:默认构造函数,创建一个空的 std::thread 执行对象。 初始化构造函数,创建一个 std::thread 对象,该std::thread 对象可被 join...原创 2018-08-05 22:54:51 · 2448 阅读 · 0 评论 -
《深入应用C++11》笔记-互斥量std::mutex、锁std::lock_guard
上一篇:《深入应用C++11》笔记-线程std::threadC++11中提供了std::mutex互斥量,共包含四种类型:std::mutex:最基本的mutex类。std::recursive_mutex:递归mutex类。std::time_mutex:定时mutex类。std::recursive_timed_mutex:定时递归mutex类。另外,还提供了两种锁类型...原创 2018-08-11 22:58:47 · 14403 阅读 · 1 评论 -
《深入应用C++11》笔记-异步线程操作std::async、std::future、std::promise、std::packaged_task
上一篇:《深入应用C++11》笔记-互斥量std::mutex、锁std::lock_guard原创 2018-08-15 19:45:41 · 2124 阅读 · 0 评论 -
《深入应用C++11》笔记-时间相关工具chrono,duration、time_point、clock
上一篇:《深入应用C++11》笔记-异步线程操作std::async、std::future、std::promise、std::packaged_taskchrono是一个模版库,包含了一系列时间相关功能。durationstd::chrono::duration 和字面意思一样,表示一段时间,原型是一个模板类:template< class Rep, c...原创 2018-08-20 19:38:49 · 6140 阅读 · 0 评论