看了《深入理解C++11》顺便做的摘要:
第二章 保持稳定性和兼容性(17处改动)
1.2 __func__预定义标识符:返回所在函数的名字
//不可作为函数参数
1.3 _Pragma操作符(字符串字面量)
//可用于宏
//和#pragma一样,但它不可用于宏
1.4 变长参数的宏定义:参数列表最后一个参数为省略号
__VA_ARGS__预定义宏:实现部分替换省略号所代表的字符串
2.2 long long整型:long long (LL,ll)和 unsigned long long(ull,Ull,uLL)
//至少有64位
//查看long long大小:<climits>:LLONG_MIN,LLONG_MAX,ULLONG_MIN
2.3 5种标准的有符号整型:signed char, short int, int, long int, long long int
//各自对应空间大小相同的无符号
2.4 __cplusplus宏:
//检验是否支持C++11编译器:
//#if __cplusplus<201103L
// #error “should use C++11”
//endif
//#error不支持立即报错终于编译,预处理起作用
5.1 在<cassert>中:assert(表达式只能为true);//否则报错编译不过
//可定义宏NDEBUG禁用assert宏,可避免程序退出状况
//程序运行时起作用
5.2 static_assert(常量表达式,”警告信息”);
//编译的时候断言
6 void excpt_func() noexcept;
void excpt_func() noexcept(常量表达式);//false抛出异常
//表明其修饰的函数不会抛出异常,为修饰符
//在常量表达式改为noexcept(T()))为操作符
//提高标准库性能,保证应用程序的安全
7 赋值a=1和a{1}等价(非静态成员)
8 sizeof可用于非静态成员,静态成员,对象实例
9 友元:参数为int 会实例化为普通的没有友元定义的类型
10 final:阻止函数继续重写(派生类)
override:函数最后面,派生类虚函数声明使用,必须重载基类的同名函数
11 默认模板参数通常是需要跟默认函数参数一起使用的
12 外部模板声明:优化项目大产生大量冗余
第三章 通用为本,专用为末(11个崭新特性) (重点)
1 继承构造函数:using声明基类
//无须写“透传”函数,不使用不会编译出真正的代码
//参数默认值会导致基类产生多个版本构造函数
//派生类不会生成默认构造函数
//不可用:基类构造函数为私有,虚继承
2 委派构造函数:减少书写时间
//初始化列表位置进行
//成员可用委派函数括号内参数赋值,但需定义私有目标构造函数
//不能形成委托环
3.1 有指针成员时,需要用户自定义拷贝构造函数,避免指针悬挂
3.2 移动构造函数:将本对象d指向h.d所指的内存,且将h的成员d置为指针空值
//HasPtrMem(HasPtrMem &&h):d(h.d){//X&&表示右值引用,可以指向临时变量;X&左值
//h.d=nullptr;
//...... }
//避免指针悬挂,尽量编写不抛出异常
3.3 判断是否为右值引用(头文件<type_traits>)例如判断string &&
//cout<<is_rvalue_reference<string &&>::value;
//is_move_constructible可以判断是否可以移动
3.4 std::move:将一个左值强制转化为右值引用,以便用于移动语句
//在<utility>中,其等同于:static_cast<T&&>(lvalue);
//std::move_if_noexcept(代替move):没有noexcept修饰返回左值引用,反之右值
3.5 移动语义一定是要修改临时变量的值,注意排除不必要的const关键字
//隐式:如果不被使用则不生成
3.6 完美转发perfect forwarding:函数模板中,完全依照模板的参数的类型,将参数传递给函 数模板中调用的另外一个函数
//完美转发用forward()替代move()强制转换右值,目前他们功能一样
4 显示转换操作符explicit:防止隐式转换,还可用在直接构造目标类型
5 初始化列表:可用于自定义类型(如vector)
//#include <initializer_list>且声明initialize_list<T>模板类为参数的构造函数
//auto:编译器自动会去根据初始化表达式的值的类型去推导变量的具体类型
//可以防止类型收窄
6 POD(Plain Old Data)判断:template<typename T> struct std::is——pod;
//1平凡的(trivial):由系统自动生成,不能定义,不能包含虚函数及虚基类
//判断:template<typename T> struct std::is_truvial;
//2标准布局:1)所有非静态成员有相同的访问权限
// 2)派生类有非静态成员,且只有一个仅包含静态成员的基类 or
// 基类有非静态成员,派生类没有
// 3)类中第一个非静态成员的类型与其基类不同(防止共享地址)
//判断:template<typename T> struct std::is_standard_layout
7 非受限联合体(union):任何非引用类型都可以成为其数据成员
8 用户自定义字面量:自定义类型 operator"" _自定义后缀(){}
9 内部名字空间inline namespace:允许在父名字空间定义或特化子名字空间的模板
10 模板的别名:using i=int;等价于typedef int i;
11 SFINEA:Substitution failure is not an error
//表示对重载的模板的参数展开导致一些类型不匹配编译器不会报错
第四章 新手易学,老兵易用(减少代码书写|增加代码可读性)
2.1 静态类型:类型检查主要发生在编译阶段
动态类型:类型检查主要发生在运行阶段
2.3 auto:不可做形参、结构体非静态成员、实例化模板作参数.(C++11剔除了C++98/C auto)
//从变量声明得到初始化表达式获得变量的类型,类型推导编译进行
//不能“带走”cv限制符:const,volatile
3 decltype(i) j=0;//类型推导编译进行,只能有一个括号,能“带走”cv限制符
//与auto类似,但以一个普通的表达式作为参数,返回表达式的类型
4 追踪返回类型的函数:返回类型后置 auto func(char*a,int b)->int;
//调用函数只写return类型,其余的作用域省略不用写
5 for(auto e:arr);//int arr[5]={1,2,3,4,5};//e在循环中会被修改则采用引用&e
//基于范围的for循环:有范围的集合不用说明循环范围(不必关心范围了)
//:前为迭代变量,:后被迭代的范围。例子表示在数组arr中用迭代器e进行遍历
//用户自己写的类,需提供++,==等操作符
第五章 提高类型安全
1 强类型枚举:enum class 枚举名称:数据类型{};//默认底层类型为int
//显示转换的数据类型为除wchar_t外的任何整型
2.2 智能指针:自动回收,避免忘记释放内存,无需调用delete(内存管理)
//unique_ptr:删除了拷贝构造函数,保留了移动构造函数的指针封装类型
//shared_ptr:允许多个智能指针共享池”拥有”同一堆分配的内存.引用计数归零才真正 // 释放所占有的堆内存
//weak_ptr:验证share_ptr有效性.指向shared_ptr指向的对象内存,缺并不拥有改内存
第六章 提高性能及操作硬件的能力
1.1const:运行时常量
constexpr编译时常量:不能修饰自定义类型定义.若修饰函数必须:
//只有一个renturn 常量表达式,有返回值(不能void函数),使用前必须定义
1.3常量表达式构造函数
//可以使自定义类型数据成为常量表达式值(不可作用于virtual成员函数)
//函数体必须为空;初始化列表只能由常量表达式赋值
2.1 std::tuple<double,char,std::string> collections;//可以接受任意多个不同类型的元素集合
2.3 参数包可以展开的位置:表达式,初始化列表,基类描述列表,类成员初始化列表,模板参数 //列表,通用属性列表,lambda函数的捕捉列表
3 #include<cstdatomic>:定义对应于内置类型的原子类型(atomic _数据类型)避免竞争
3.3 弱顺序:打乱指令执行顺序,按照打乱后的顺序执行
强顺序:与看到的指令执行顺序一致不打乱
4 TLS线程局部变量:拥有线程生命期及线程可见性的变量
//在全局或者静态变量的声明中加上关键字__thread
//声明:int thread_local errCode;
5 quik_exit函数:不执行析构函数而只是使程序终止
at_quik_exit函数
//至少32个注册函数的调用
第七章 为改变思考方式而改变 (重点)
1 0的二义性:C++98字面量常量0中既是一个整型,又是一个无类型指针(void*)
nullptr:指针空值常量,不能向bool隐式转换,空间大小跟void*相同,编译常量
nullptr_t:指针空值类型//在#include<cstddef>
2 (可以类外)构造函数声明时加上=default:生成默认构造函数//Two()=default;显式缺省
//=detelt删除缺省版本,无法重载
构造函数声明为private且不提供函数实现:则无法使用(提供实现版本可以友元)
3.2 lambda函数:[捕捉列表](参数列表)mutable->返回类型{函数体};
//[](int x,int y)->int{return x + y;};//举例,[]表示其是lambda函数,最为省略的lambda:[]{};
//mutuble:取消常量性,参数列表不可空;默认const,无参参数列表可空
//->返回类型:不需要返回值及返回类型明确可省略
//捕捉列表:描述上下文哪些数据可被lambda使用及使用方式(值或引用传递)
// [var] 值传递(成为了函数的常量)方式捕捉变量
// [=] 值传递捕捉所有父作用域(包含lambda函数语句块)的变量包括this
// [&var]引用传递(成为了函数的变量)捕捉变量var
// [&] 引用传递捕捉所有父作用域的变量(包括this)
// [this] 值传递捕捉当前this指针
//捕捉列表不可重复传递,可向函数指针转换
3.3 functor仿函数:重定义成员函数operator()的一种自定义类型对象(形式与lambda等价)
//通常编译器都会把lambda函数转化成为一个仿函数对象(不能完全替代)
3.4 利用lambda函数来封装一些代码逻辑,具有函数的包装性和就地可见的自说明性
//lambda默认内联inline,匿名函数,局部函数(在函数作用域中定义函数)
第八章 融入实际应用
1.1 alignof操作符:查看数据对齐方式//cout<<alignof(Color)<<endl;
alignas对齐描述符:指定数据对齐(以2的自然数幂次)//struct alignas(32) Color{...};
//查询基本对其值(常常是long double):alignof(std::max_align_t)
//std::align:动态制定对齐方式调整数据块的位置
//aligned_storage:第一个参数为其大小,第二个参数为其对其值
//aligned_union:aligned_storage,但使用了变长模板参数
2.2 [[ attribute-list ]] :通用属性
//[[noreturn]]:标识不会返回的函数(函数后续代码不会再被执行)
//[[carries_dependency]]:解决弱内存模型平台使用memory_order_consume内存顺序枚 //举问题
3.1 GB2312:作为简体国家标准颁布使用
BIG5:繁体中文
3.2 char16_t:存储UTF-16编码的Unicode数据
char32_t:存储UTF-32编码的Unicode数据
//常量字符串前缀:u8(UTF-8编码),u(UTF-16编码),U(UTF-32编码)
3.3 locale:描述一些必须知道的区域特征
codecvt:Unicode字符编码转换
4 原生字符串字面量:R”(字符串)”
//“所见即所得”,不需要控制字符调整格式(\t,\n)
PS:
//去除了无用关键字:export
//swap方法从<algorithm>移到了<utility>
//新顶级namespace :posix
//errno变量是线程局部的
更多说明请参阅网址: https://en.cppreference.com/w/