C++11新特性
C++11易用性改进
静态断言
使用范围几乎不受限制
static_assert断言对象必须是常量表达式,编译期给出断言警告。用于ERROR提示
强枚举类型
// enum关键字
enum class HighSchool: unsigned int {
student,
teacher,
principal
};
使用强枚举类型无法隐式和整型做转换,另外也无法跳出类型作用域,使用前必须先声明类型名。还可以指定类型的底层类型,在忽略底层类型的时候使用int类型。这样也能避免跨平台的问题。
列表初始化
const
const关键字表示只读,不允许修改原始的值
for循环
//declaration:遍历声明,遍历过程中的元素被存储到这里
//expression:遍历对象(表达式、容器、数组、初始化列表)
for(declaration : expression)
{
//代码体
}
using
//using用于重新定义类型别名,可以给模板类重定义
//语法格式
using newType = oldType;
//例如
using uint_t = int;
//这里funp是一个别名,本质是函数指针,返回类型为int,两个参数的类型分别为(int,int)
using funp = int(*) (int,int)
nullptr
C++种初始化空指针 就是将其初始化为NULL,避免产生野指针;
C++中NULL和0等价;为了符合兼容性,使用nullptr来初始化空类型指针
default和delete
函数声明 + " = default " ==> 为显式声明的 " = default "函数自动生成函数体;
函数声明+ " = delete " ==> 该函数禁用
final和override
这俩是继承控制关键字。
final:
final修饰函数,只能修饰虚函数,可以阻止子类重写父类这个函数;
final修饰类,则这个类不允许被继承;
override:
用于子类的虚函数,确保子类一定要重写父类的虚函数,否则报错。
constexpr 修饰符
与const区别:const用于设置变量只读和修饰常量。在运行时才会检测出来,用错在编译时不会报错。
constexpr用于修饰常量表达式,常量表达式,指的就是由多个(≥1)常量(值不会改变)组成并且在编译过程中就得到计算结果的表达式。
安全红线:禁止在头文件使用const定义全局常量。
练习题:简单工厂模式
C++11类型推导
auto用法
auto用于自动类型推导
限制:不能在函数的参数中使用;
不能作用于类的非静态成员变量(不能用在没有static修饰的成员变量中);
不能定义数组;
不能用于模板。
decltype用法
和 auto 的功能一样,都用来在编译时期进行自动类型推导。主要功能用来声明类型。
例子1:exp 是一普通变量或普通表达式/类表达式的时候,表达式里是个什么类型,推导的就是个什么类型
例子2:返回值类型后置:在函数名和参数列表后面指定返回类型,常用于模板泛型编程。
右值引用
右值引用
C++11新增加了一个类型,称为右值引用,记录为&& ;
左值: 存储在内存中、有明确存储地址(可取地址)的数据;
右值:可以提供数据值的数据(不可取地址);
一般来说所有变量名或对象都是左值,右值是匿名的 ,用于实现移动语义与完美转发。
区分左值右值:主要看其能否取地址。能够对表达式&就是左值,否则就是右值
右值分类
纯右值:非引用返回的临时变量、运算表达式产生的临时变量、原始字面量和 lambda 表达式等
将亡值:与右值引用相关的表达式,比如,T&& 类型函数的返回值、 std::move 的返回值等。
引用无论声明左值引用还是右值引用都必须立即进行初始化,因为引用类型本身并不拥有所绑定对象的内存,只是该对象的一个别名。通过右值引用的声明,该右值又“重获新生”。 int&& i = 5 这样是对的 int& i = 5 这样是错的
右值引用的移动构造函数
延续将亡值的生命周期
移动语义move
move()可以将左值转化为右值 等价于 static_cast强转
闭包的实现
闭包
什么是闭包?
函数是代码,状态是一组变量,将代码和一组变量捆绑 (bind) ,就形成了闭包。 闭包的状态捆绑,必须发生在运行时。
仿函数
将一个对象当做函数来实现。本质为类中对()的重载,类中实现operator()
bind绑定器
延迟执行的思想:将函数和函数需要使用的参数保存起来,然后在需要时调用
情况1:所有的参数都知道,直接把所有参数绑定好就可以。(常用)
情况2:只知道部分参数,这个时候除了绑定需要的参数以外,还需要使用占位符把一些参数暴露出来。(少用)
function用法
主要作用时把任意的函数调用包装到一个一个对象里,并且这个对象,可以保存,传递,复制,然后在合适时间地点调用。
std::function的用法类似于函数指针,底层是一个函数模板类。
std::function可以用来包装仿函数、普通函数、类的成员函数等。
lambda表达式
//格式
[capture](params) opt -> ret {body;};
//捕获列表[] : 捕获一定范围内的变量
//参数列表() : 和普通函数的参数列表一样,如果没有参数,参数列表选项可以省略
//opt选项 : 可省略
//mutable: 可以修改按值传递进来的拷贝(注意只能修改拷贝,而不是值本身)
//exception:指定函数抛出异常,如抛出整数类型的异常,可以使用throw();
//参返回值类型 : 在C++11中,lambda表达式的是通过返回值后置语法来定义的。
//函数体:函数的具体实现部分,必须有,函数体可以为空。
标签:系列,函数,右值,int,C++,基础知识,类型,表达式
From: https://www.cnblogs.com/wj0518/p/17321102.html