C++进阶之路《C11新特性》
C11
- 1.区别于C语言的耍流氓强转转换
- C语言强转
- C++强转
- static_cast<>:数据类型的转换
- const_cast<>:去除常性的强转
- reinterpret_cast<>:重新解释
- dynamic_cast<>:动态转换
- 2.std::move的底层实现
- 3.完美转发
- 模板中的&&意思是类型未定义
- std::forward<>的底层实现
- 4.auto
- 5.decltype:根据表达式推演出类型
- 6.NULL和nullptr的区别
- 7.列表初始化
1.区别于C语言的耍流氓强转转换
C语言强转
特点:C语言中所有的转换都是一个(),但是并不知道这样做的目的是什么
C++强转
static_cast<>:数据类型的转换
特点:只是值的转换
const_cast<>:去除常性的强转
reinterpret_cast<>:重新解释
dynamic_cast<>:动态转换
动态转换存在于继承关系中
继承关系的产生一定是因为有虚函数;没有虚函数就不要有继承关系。继承关系带来的问题就是因为有虚函数,产生了多态
2.std::move的底层实现
思路:
1.有一个泛化版本,一个普通引用的部分特化版本,一个右值引用的部分特化版本;
2.都使用 type 得到其原始数据类型;
3.获取原始类型的 type
4.进行类型的转换,强转为原生类型的右值引用类型
5.并没有把_Ty中的常性去除,这就导致如果参数是一个常引用,调用移动构造函数时系统会直接调用拷贝构造函数
template<class _Ty>
struct my_remove_reference
{using type = _Ty;using _Const_thru_ref_type = const _Ty;
};template<class _Ty>
struct my_remove_reference<_Ty&>
{using type = _Ty;using _Const_thru_ref_type = const _Ty&;
};template<class _Ty>
struct my_remove_reference<_Ty&&>
{using type = _Ty;using _Const_thru_ref_type = const _Ty&&;
};template<class _Ty>
using my_remove_reference_t = typename my_remove_reference < _Ty>::type;template<class _Ty> //未知的引用概念
my_remove_reference_t<_Ty>&& my_move(_Ty&& _Arg)
{ //强转为某类型的右值引用return static_cast<my_remove_reference_t<_Ty>&&>(_Arg);
}
3.完美转发
模板中的&&意思是类型未定义
std::forward<>的底层实现
template<class _Ty>
struct my_remove_reference
{using type = _Ty;using _Const_thru_ref_type = const _Ty;
};template<class _Ty>
struct my_remove_reference<_Ty&>
{using type = _Ty;using _Const_thru_ref_type = const _Ty&;
};template<class _Ty>
struct my_remove_reference<_Ty&&>
{using type = _Ty;using _Const_thru_ref_type = const _Ty&&;
};template<class _Ty>
using my_remove_reference_t = typename my_remove_reference < _Ty>::type;template<class _Ty>
_Ty&& my_forward(my_remove_reference_t < _Ty>& Arg)
{return static_cast<_Ty&&>(Arg);
}
4.auto
1.auto实际是占位符,编译过程中推导出类型后就会将auto替换
2.auto定义的变量必须初始化,因为编译器要通过值来推导变量的类型
3.不能给出二义性初始值
4.auto不能作为函数参数
5.auto不能成为集合类型
5.decltype:根据表达式推演出类型
6.NULL和nullptr的区别
NULL与nullptr区别
无论是定义为0,还是无类型,编译器都把它当作整型对待。因此C11为了解决该问题,发明了一个关键字 “ nullptr” ,认为它是一个空指针常量
7.列表初始化
对于所有的内置类型或自定义类型的初始化方案都可以使用列表方式
动态开辟空间
C++进阶之路《C11新特性》相关推荐
- C++ C11新特性
C11新特性 move移动构造如何实现 C++ 类型强转 模板编译分裂性 未定义类型 完美转发如何实现 auto 预给值 nullptr 和 NULL 的区别 move移动构造如何实现 class M ...
- HTML中三维特性,前端进阶系列(三):HTML5新特性
HTML5 是对 HTML 标准的第五次修订.其主要的目标是将互联网语义化,以便更好地被人类和机器阅读,并同时提供更好地支持各种媒体的嵌入.HTML5 的语法是向后兼容的.现在国内普遍说的 H5 是包 ...
- java进阶一 java8的新特性
前言 前面总结了java基础相关的知识点,包含数据类型.修饰符和string.java三大特性.多线程.IO流,异常等,接下来我们更深一步看看.jdk8发布版已经有一段时间的,里面有些新特性值得去学习 ...
- C11新特性六 —— lambda表达式
文章目录 lambda 表达式 1. lambda表达式语法 2. lambda表达式特点 lambda 表达式 lambda表达式 表示一个可调用的代码单元,没有命名的内联函数,不需要函数名因为我们 ...
- 卷不动也得继续学!紧跟vue3的步伐,再来get一波进阶新特性!
vue3进阶新特性 一.
- 从懵懂无知到独挡一面——那些萌新程序员的进阶之路
刚刚入职一家IT公司成为一名初级开发工程师,我们如何在技术这条路线上野蛮生长呢. 这条技术进阶之路就是一个金字塔形,越往上人越少. 作为一个初出茅庐的开发人员提升自己和职业生涯前景 无论你是正在找你的 ...
- C语言现行标准C11的新特性
C11标准是 ISO/IEC 9899:2011 - Information technology – Programming languages – C 的简称,曾用名为C1X. C11标准是C语言 ...
- C11 标准 新特性
C11 C11指ISO标准ISO/IEC 9899:2011,是当前最新的C语言标准.在它之前的C语言标准为C99. 新特性 对齐处理(Alignment)的标准化(包括_Alignas标志符,ali ...
- 安卓扁平化之路专题(一)Android 4.4新特性
Android从3.0版本开始走上了扁平化设计的道路,在Android3.0之后,Google对UI导航设计上进行了一系列的改革,其中有一个非常好用的新功能就是引入的ActionBar,他用于取代3. ...
最新文章
- AMD/NV大跌2周后仅两天收复失地 挖矿成背后推手
- 快要普通话考试了,急需最后一题的根据话题自由讲话的演讲稿!(不要那些已经被用过...
- 解决vue在ios或android中用webview打开H5链接时#号后面的参数被忽略问题angular同样适用
- spring boot 完整集成jsp。(亲测可用)
- Siege的线程模型-基于版本2.56
- [云炬python3玩转机器学习] 5-9 scikit-learn中的回归问题
- video和dvd audio区别:
- 使用 Windbg 分析一个 异步操作 引发的 Crash 异常
- python编写学生选课系统程序_python面向对象编程小程序- 选课系统
- ISO27001适用性-导图
- python修改csv文件字段顺序_Pandas中DataFrame交换列顺序的方法实现
- UOJ356 [JOI2017春季合宿] Port Facility 【启发式合并】【堆】【并查集】
- 9.14-9.18随笔之二
- 世界足坛的一些著名德比
- 三线表里加小短线_三线表的格式
- 大漠插件常见问题汇总
- 关于微信第三方服务消息提醒
- Python+Django开发游戏充值管理后台
- “云+移动互联时代,2014移动平台高峰论坛”隆重举行
- 如何学好游戏3D引擎编程(摘抄)