C++11
文章平均质量分 86
记录一些C++11的一些新特性
林夕07
从事Windows桌面开发,GIS平台的二次开发,地图服务、仿真等等。日常分享一些使用技巧。曾获得新星计划第三季人工智能赛道TOP5;阿里云专家博主
展开
-
C++11之空指针-nullptr
在C++中nullptr到任何指针的转换都是隐式的,而(void)0则必须经过类型转换后才能使用。而且nullptr是一个编译期的常量,只是一个关键字,能够为编译器所识别。而(void)0只是一个强制类型转换,返回是一个void*指针类型。原创 2022-11-03 20:34:06 · 831 阅读 · 0 评论 -
C++11之常量表达式(const与constexpr的区别)
C++11标准要求,编译时的浮点数常量表达式的精度必须大于等于运行时的浮点数常量的精度(为了解决浮点数精度丢失问题)。当我们在添加了常量表达式构造函数后就必须要添加非常量表达式构造函数的版本,因为常量表达式构造函数也可用于非常量表达式中的类型构造。所以,在使用这个常量数值创建数组时编译失败,当作枚举成员赋值也编译失败,作为swicth中的case 分支也会编译错误。规定,当声明为常量表达式的模板后,某个该模板的实例化结果不满足常量表达式的要求后,是一个常量表达式,所以编译器进行编译时就会计算出函数的值。原创 2022-10-28 21:51:44 · 1184 阅读 · 3 评论 -
C++11之强类型转换(枚举类)
枚举类型是C/C++内置类型,用于穷举同一类别下的个体。但枚举值必须是整型。如果不给枚举变量赋予值的话默认从0开始,若前一个枚举成员有值,那么当前枚举成员的值就是前一个枚举成员值+1。原创 2022-10-25 23:10:33 · 4608 阅读 · 5 评论 -
C++11之基于范围的for循环
上述的几种遍历方式的共同点就是都需要写明循环的一个范围。对于我们需要完整的遍历一个有范围的集合/数组时,完全可以让编译器自动计算出范围。在使用范围遍历的方式遍历stl的容器时,如果你使用auto声明迭代器的变量,那么推导出来的类型是迭代器解引用后的对象。但范围遍历不能适用于所有情况,范围遍历的条件就是循环迭代的范围必须是可确定的。在C++98标准中,当我们遍历数组时,一般方法就是下标遍历和指针遍历。等都是可以正常使用的。遍历没有明确范围的数组,是不能使用范围遍历方法的。现在我们使用范围遍历对数组进行遍历。原创 2022-10-24 20:56:53 · 3148 阅读 · 2 评论 -
C++11之追踪返回类型
追踪返回类型的强大远不止于此,在模板函数中加入追踪返回类型可以实现参数与返回值类型不同时的转发。还可以广泛应用于函数指针、普通函数、函数应用等等中。没有返回类型的函数也可以被声明为追踪返回类型,只需要将最后的return_type写为void即可。原创 2022-10-21 20:24:13 · 617 阅读 · 0 评论 -
C++11之decltype类型推导(使用场景、推导四规则、cv限定符)
`decltype`算得上是`C++11`中类型推导使用方式上最灵活的一种。虽然看起来它的推导规则比较复杂,有的时候跟`auto`推导结果还略有不同,但大多数时候,我们发现使用`decltype`还是自然而亲切的。一些细则的区别,读者可以在使用时遇到问题再返回查验。而下面的追踪返回类型的函数定义,则将融合`auto`、`decltype`,将`C++11`中的泛型能力提升到更高的水平。原创 2022-10-18 20:34:25 · 2084 阅读 · 3 评论 -
C++11之auto类型推导
在早期的C++中,auto的功能是具有自动存储期的局部变量,但是因为声明变量时默认都是自动存储期的局部变量,所以auto就显得很鸡肋,为此在C++11标准委员会就将auto重新定义了。由一个存储类型指示符(storage-class-specifier,如 static、extern等)变成了新的类型指示符(type-specifier,如int、float等)。原创 2022-10-10 21:27:06 · 1227 阅读 · 1 评论 -
C++11之一般化的SFINAE规则
在C++11标准对这样的状况,尤其是模板参数替换时使用了表达式的情况进行了明确规定,即表达式中没有出现“外部于表达式本身”的元素,比如说发生一些模板的实例化,或者隐式地产生一些拷贝构造函数的话,这样的模板推导都不会产生SFINAE 失败(即编译器报错)。这样一来,C++11中的一些新特性将能够成功地进行广泛的应用,进一步地,新的STL也将因此受益。原创 2022-10-09 20:00:00 · 958 阅读 · 2 评论 -
C++11之模板的别名
在C++11中using覆盖了typedef所具有的所有功能,并且还有着typedef没有的功能。原创 2022-10-08 19:11:15 · 489 阅读 · 1 评论 -
C++11之内联名字空间(inline namespace)和ADL特性(Argument-Dependent name Lookup)
在早期C项目中,我们常常会因为命名冲突问题需要有一个“字典”来存储所用过的变量。这是因为在C语言中非静态全局变量、函数都是全局共享的。C++就通过命名空间(也叫名字空间)来解决C语言中这个头疼的问题。实现分割全局共享的命名空间。程序员在编写代码时可以自己设置命名空间,使用者只需要通过空间名::函数/变量或者using namespace 空间名就可以使用(推荐使用前者方法)。但是,当我们空间名嵌套多层时在使用上不是很方便。原创 2022-09-29 22:59:07 · 1049 阅读 · 1 评论 -
C++11之用户自定义字面量(ClassType operator““_C(param...))
在实际的开发过程中,我们会经常使用到结构体来表示一个新的类型。那么在遇到结构体类型都数据进行运算时,只能先依次定义,然后进行运行。这在测试环节会非常的繁琐,为此C++11标准增加了可以通过后缀表示的操作符来将字面量转换为需要的类型。原创 2022-09-28 20:18:27 · 1009 阅读 · 0 评论 -
C++11之防止类型收窄(列表初始化)
在C++11中引入了列表初始化,列表初始化可以有效的防止类型收窄。一般来说数据的改变将大概率会导致程序出错,这有效的阻止了一些隐患,这也是列表初始化有别于其他初始化方式。原创 2022-09-19 20:22:10 · 881 阅读 · 1 评论 -
C++11之初始化列表
其实在初始化列表这个词并不陌生,早在C++98中就已经引入了。在C++11标准中,又对初始化列表的功能又进行一次强化。原创 2022-09-15 06:30:00 · 1865 阅读 · 0 评论 -
C++11之显式转换操作符-explicit
显示类型转换explicit关键字并没有完全禁止从源类型到目标类型的转换,只是不允许拷贝构造函数和隐式类型转换罢了。所以我们就不能通过复制发方式或者通过函数参数的形式进行从源类型到目标类型的转换。所以我们有必要在创建类时及时添加explicit关键字,禁止隐式类型转换。原创 2022-09-13 21:00:38 · 390 阅读 · 0 评论 -
C++11之委派构造函数
在C++11中,所谓委派构造,就是指委派函数将构造任务委托给某个目标构造函数来完成类构造的一种方式。通俗地讲,就是允许构造函数通过初始化列表方式来调用同一个类中的另一个构造函数。原创 2022-09-08 22:04:37 · 924 阅读 · 0 评论 -
C++11之继承构造函数(using 声明)
通过这种继承构造函数的方式是隐式声明的。也就表示如果这个继承构造函数不使用,那么编译器就不会为其产生真正的函数。通过这个方式生成子类的各种构造函数比原有的方法更加简洁并且高效。原创 2022-09-07 21:01:30 · 1978 阅读 · 0 评论 -
C++11之右值引用:移动语义和完美转发(带你了解移动构造函数、纯右值、将亡值、右值引用、std::move、forward等新概念)
深度解析右值引用,带你逐层剖解移动语义、完美转发、纯右值、将亡值、右值引用、move、forward等,全文代码量占一半,实操性很强/原创 2022-08-31 22:26:42 · 1076 阅读 · 1 评论 -
C++11Lanbda表达式(匿名函数)
C++11中引入了Lambda表达式用于定义并创建匿名函数对象,以简化编程工作。[函数对象参数](操作符重载函数参数)mutable->返回值类型{函数体}{statement;}函数对象参数(也叫捕获列表)[]标识一个Lambda的开始,不可省略。函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。函数对象参数只能使用那些定义Lambda为止时且在Lambda所在作用范围内可见的局部变量和所在类的this。函数对象参数有下面几种[]空的,就是无法访问作用域外的。值传递方式。...原创 2022-07-27 21:05:29 · 964 阅读 · 0 评论 -
C++11之正则表达式(regex_match、regex_search、regex_replace)
详细讲解C++中的正则匹配如何使用,对regex_match、regex_search、regex_replace函数进行介绍。原创 2022-06-27 20:22:05 · 12996 阅读 · 0 评论 -
C++11之智能指针(unique_ptr、shared_ptr、weak_ptr、auto_ptr)浅谈内存管理
在Effective C++第13条款中也建议:如果想要手工释放资源,容易发送某些错误。使用这类智能指针往往能让程序员更少犯错。原创 2022-07-12 22:56:29 · 891 阅读 · 0 评论 -
C++11之线程库(Thread、Mutex、atomic、lock_guard、同步)
在C++ 11引入了对多线程的支持。包括线程、互斥锁、原子操作、自动加减锁和同步。下面就分别介绍一下对应的用法。线程:系统分配cup时间和调度的基本单位#includethread t1(函数地址);//无参thread t2(函数地址,参数1,参数2,…);//有参A a;thread t3(&A::output,&a);成员函数,全局函数实例:成员函数实例:多线程的冲突问题a. 出现了更高等级的指令b. 该线程的时间片到了#include原子操作Atomic...原创 2022-06-28 21:08:11 · 1064 阅读 · 0 评论 -
C++11之强制类型转换(static_cast,const_cast,dynamic_cast,reinterpret_cast)
为解决C旧式类型转换的缺点,C++导入4个新的转换操作符:static_cast,const_cast,dynamic_cast,reinterpret_cast。原创 2022-07-15 21:22:14 · 1065 阅读 · 0 评论