C++基础知识系列-2

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表达式的是通过返回值后置语法来定义的。
//函数体:函数的具体实现部分,必须有,函数体可以为空。



posted @   菜鸟C_5022  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
点击右上角即可分享
微信分享提示