C++新特性
文章平均质量分 65
C11、C14,C17、C20的C++新特性
一只野生的善逸
坐标杭州,单身...呃,一起约轮滑,漂移板,柯南,宫崎骏,新海诚的动漫电影呀!
展开
-
C++笔记之using
typedef 旧的类型名 新的类型名;// 使用举例 typedef unsigned int uint_t;被重定义的类型并不是一个新的类型,仅仅只是原有的类型取了一个新的名字。和以前的声明语句一样,这里的声明符也可以包含类型修饰,从而也能由基本数据类型构造出复合类型来。C++11 中规定了一种新的方法,使用别名声明 (alias declaration) 来定义类型的别名,即使用 using。原创 2022-09-25 14:50:46 · 337 阅读 · 0 评论 -
C++正则匹配实现提取两个指定字符串之间的字符串
比如Known=4325,guid=qwer233,Element=fdger2354, 把guid=后面的qwer233给提取出来。即提取“guid=”和“,”之间的字符串。#include <iostream>#include <string>#include <regex>using namespace std; int main(){ string text = "Known=4325,guid=qwer233,Element=fdger2354原创 2022-05-31 04:39:13 · 1063 阅读 · 0 评论 -
C++新特性探究(6.1):auto和decltype的类型推断差异所在
例附上例代码:#include <iostream>using namespace std;int Max(int a,int b){ return a>b?a:b;}class MM{ public: MM(int age):age(age){} void print(){cout<<age<<endl;} int age;};//不能有以下用法//auto print(auto max)//{// return max;原创 2021-06-10 17:49:38 · 114 阅读 · 0 评论 -
C++新特性探究(18.3):C++11 weak_ptr智能指针
C++11 weak_ptr智能指针1、weak_ptr指针的创建2、weak_ptr模板类提供的成员方法例2:程序执行结果为:2110原创 2021-06-08 20:47:55 · 122 阅读 · 0 评论 -
C++新特性探究(18.2):C++11 unique_ptr智能指针详解
作为智能指针的一种,unique_ptr 指针自然也具备“在适当时机自动释放堆内存空间”的能力。和shared_ptr指针最大的不同之处在于,unique_ptr指针指向的堆内存无法同其它unique_ptr共享,也就是说,每个unique_ptr 指针都独自拥有对其所指堆内存空间的所有权。 这也就意味着,每个 unique_ptr 指针指向的堆内存空间的引用计数,都只能为 1,一旦该 unique_ptr 指针放弃对所指堆内存空间的所有权,则该空间会被立即释放回收。1、unique_ptr智能原创 2021-06-08 20:25:58 · 189 阅读 · 0 评论 -
C++新特性探究(18.1):C++11 shared_ptr智能指针
在实际的 C++ 开发中,我们经常会遇到诸如程序运行中突然崩溃、程序运行所用内存越来越多最终不得不重启等问题,这些问题往往都是内存资源管理不当造成的。比如: 有些内存资源已经被释放,但指向它的指针并没有改变指向(成为了野指针),并且后续还在使用; 有些内存资源已经被释放,后期又试图再释放一次(重复释放同一块内存会导致程序运行崩溃); 没有及时释放不再使用的内存资源,造成内存泄漏,程序占用的内存资源越来越多。 针对以上这些情况,很多程序员认为C++语言应该提供更友好的内存管理机制,这样原创 2021-06-08 20:05:04 · 224 阅读 · 1 评论 -
C++新特性探究(十八):智能指针
一.智能指针及RAII问题: C++中最令人头疼的问题是强迫程序员对申请的资源(文件,内存等)进行管理,一不小心就会出现泄露(忘记对申请的资源进行释放)的问题。C++的解决办法:RAII 在传统 C++ 里我们只好使用 new 和 delete 去『记得』对资源进行释放。而 C++11 引入了智能指针的概念,使用了引用计数的想法,让程序员不再需要关心手动释放内存。解决思路: 利用C++中一个对象出了其作用域会被自动析构,因此我们只需要在构造函数的时候申请空间,而在析构函数(在离开作用域时调原创 2021-03-14 13:12:27 · 285 阅读 · 0 评论 -
C++新特性探究(十七):chrono计時器
一.前言 在我们写程序过程中,有时候需要测试我们的程序语句执行时间的耗时,当前也是有很多的库提供我们去使用,一直没有良好的跨平台的库可以提供出来;而且一般这种代码也是由我们程序员自己调用系统的库来进行,但是往往会出现精度不足和不支持跨平台等问题;C++11中引进boost中的chrono库;可实现高精度时钟,可以做到纳秒级;二.chrono库 chrono中用time_point模板类表示时间点,其支持基本算术操作;不同时钟clock分别返回其对应类型的时间点。 需要得到绝对时点的场景使用原创 2021-03-13 15:44:48 · 703 阅读 · 0 评论 -
C++新特性探究(9.1):functor仿函数探究
Functor 对象模拟函数 把类对象,像函数名一样使用。 仿函数(functor),就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator( ),这个类就有了类似函数的行为,就是一个仿函数类了。operator( )语法格式:例:pow->mypow附上例代码://小问学编程#include<iostream>#include<vector>using namespace std;class Pow{public: in原创 2021-02-22 21:02:41 · 184 阅读 · 0 评论 -
C++新特性探究(13.6):右值引用再探究
右值引用 右值引用是C++11 引入的与Lambda 表达式齐名的重要特性之一。它的引入解决了C++ 中大量的历史遗留问题,消除了诸如std::vector、std::string 之类的额外开销,也才使得函数对象容器std::function 成为了可能。左值、右值的纯右值、将亡值、右值 要弄明白右值引用到底是怎么一回事,必须要对左值和右值做一个明确的理解。 左值(lvalue, left value),顾名思义就是赋值符号左边的值。准确来说,左值是表达式(不一定是赋值表达式)后依然存在的持转载 2021-02-15 11:06:27 · 283 阅读 · 1 评论 -
C++新特性探究(13.5):右值引用
运行结果:附上例代码://小问学编程//左值:在内存中有确切位置的值//右值:是一个暂时存在的值#include <iostream>using namespace std;int main(){ int a(10);//a在内存中有地址,数据是10 int b(11);//b在内存中有地址,数据是11 int c=a+1;//&(a+1)没有内存地址,是一个临时的值,是一个右值。仅短暂存在于寄存器中 int d=a+2;// int& f=.原创 2021-02-12 21:57:43 · 817 阅读 · 0 评论 -
C++新特性探究(十六):move constructor移动构造
附加语:栈对象可以返回,栈对象的引用不可以返回 移动构造本质特定意义(使用场景下的浅拷贝),取名为移动构造,解决的还是效率问题。一. 拷贝语义 对于类中,含有指针的情况,即含有堆内存资源的情况,要自实现其拷贝构造和拷贝赋值。也就是所谓的深拷贝和深赋值。已经是一种共识:例.深拷贝——以前的固定式思维:对象中含有堆上的资源–>深拷贝例.浅拷贝例.右值引用 上面的过程,我们已经知晓,ret作为右值引用,引用了临时对象,由于临时对象是待返回对象的复本,所以表面上看起来是,待返回对原创 2021-02-12 14:44:15 · 1144 阅读 · 1 评论 -
C++新特性探究(十五):bind
bind语义 bind 用来将可调用对象和参数一起进行绑定。可调用对象包括普通函数、全局函数、静态函数、类静态函数甚至是类成员函数,参数包括普通参数和类成员。绑定后的结果,可以使用 std::function 进行保存,并延迟调用到我们需要的时候。一. 绑定普通函数与参数及占位 bind 绑定顺序,也就是函数中形参的声明顺序。placeholders::_x中的序列是实参的顺序。运行结果:附代码://小问学编程#include<iostream>#include<原创 2021-02-09 14:22:13 · 252 阅读 · 0 评论 -
C++新特性探究(十四):function
类模版 std::function 是可调用对象的包装器,可以包装除了类成员函数之外的所有可调用对象。包括,普通函数,函数指针, lambda,仿函数。 通过指定的模板参数,它可以用统一的方式保存,并延迟执行它们。所谓的延迟执行,就是回调了。 ...原创 2021-02-08 18:24:16 · 719 阅读 · 0 评论 -
C++新特性探究(十三):右值引用(r-value ref)&&探究
一. 右值定义 通俗来讲,赋值号左边就是左值,赋值号右边的就是右值。可以取地址是左值,不可以取地址的是右值。C++11,之前没有明确提出右值的概念,所以C++11以前这些说话都是正确。 C++11中的左值,仍然等同于C++98左值。C++11中的右值,除了C++98中的右值以外,增加了将亡值的。对比图如下:右值引用解决了什么问题? 为什么要引入右值引用这个概念,其实就是为了解决临时对象带来的效率问题。 比如,我们返回一个临时对象。在C++课中,返回栈对象第一章中,我们讲过,栈对象是可.原创 2021-02-05 00:15:57 · 371 阅读 · 2 评论 -
C++新特性探究(十二):static_assert(提前判误)
相关博文:C++之assert、NDEBUG探究 static_assert这个关键字,用来做编译期间的断言,因此叫做静态断言。其语法很简单:static_assert(常量表达式,提示字符串)。 如果第一个参数常量表达式的值为真(true或者非零值),那么static_assert不做任何事情,就像它不存在一样,否则会产生一条编译错误,错误位置就是该static_assert语句所在行,错误提示就是第二个参数提示字符串。 使用static_assert,我们可以在编译期间发现更多的错误,用编译原创 2021-02-04 11:54:21 · 332 阅读 · 0 评论 -
C++新特性探究(十一):enum class(struct)
相关博文:C/C++枚举探究从C++到C++11 枚举体的声明和定义使用enum class或是enum struct,二者是等价的。使用enum class\enum struct不会与现存的enum关键词冲突。而且enum class/enum struct具有更好的类型安全和类似封装的特性(scoped nature)。例1附例1代码://小问学编程#include<iostream>#include<fstream>using namespace st.原创 2021-02-03 20:41:36 · 223 阅读 · 0 评论 -
C++新特性探究(十):Lambda
一. 匿名函数 简短函数,就地书写,调用。即Lambda存在的意义,常用于取代作回调用的简短函数指针与仿函数。 就地书写,因只有函数体,即无函数名,也称匿名函数。格式最小的 Lambda:[ ] { }例1:附例1代码://小问学编程#include<iostream>using namespace std;int main(){ auto f=[]{return 1+2;}; cout<<f()<<endl; .原创 2021-02-02 18:59:35 · 204 阅读 · 1 评论 -
C++新特性探究(九):functor仿函数
仿函数这玩意,技术难度不高,但侮辱性极强!一. operator( ) 重载了operator()的类的对象,在使用中,语法类似于函数。故称其为仿函数。此种用法优于常见的函数回调。例1:附例1代码://小问学编程#include<iostream>#include<vector>#include<algorithm>using namespace std;class Compare{public: int operator()(i.原创 2021-02-01 17:18:47 · 221 阅读 · 1 评论 -
C++新特性探究(八):初始化列表(Initialization List)再探究
统一初始化风格附上例代码://小问学编程#include<iostream>#include<vector>using namespace std;int main(){ int a=3; int b{3}; int arr[]={1,2,3}; int arr2[]{1,2,3}; vector<int> vi={1,2,3}; vector<int> vi2{1,2,3}; return原创 2021-02-01 13:43:02 · 249 阅读 · 0 评论 -
C++新特性探究(五):for循环、范围for语句
C++新标准提供的范围for语句.这种语句遍历给定序列中个元素并对序列中每一个值执行某种操作,其语法形式是: 其中,expression部分是一个对象,用于表示一个序列。declaration部分负责定义一个变量,该变量将用于访问序列中的基础元素。每次迭代,declaration部分的变量会被初始化为expression部分的下一个元素值。例1:代码中的 auto 关键字让编译器来决定 c的类型,每次迭代后,str的下一个字符赋值给 c例2:普通的for语句例3:例4:...原创 2020-12-26 01:31:02 · 377 阅读 · 0 评论 -
C++新特性探究(四):Raw String Literals
C/C++中提供了字符串,字符串的转义序列,给输出带来了很多不便,如果需要原生义的时候,需要反转义,比较麻烦。 C++提供了R"( )",原生字符串,即字符串中无转义,亦无需再反义。但是注意( )中的 )" 会导致提前结束。示例:附上例代码://小问学编程#include <iostream>using namespace std;string path = "C:\Program Files (x86)\alipay\aliedit\5.1.0.3754";stri.原创 2021-02-01 00:30:36 · 568 阅读 · 0 评论 -
C++新特性探究(三):=default、=delete
一. =default C++的类有四类特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符。 这些类的特殊成员函数负责创建、初始化、销毁、或者拷贝类的对象。 如果程序员没有显示地为一个类定义某个特殊的成员函数,而又需要用到该特殊成员函数时,则编译器会隐式的为这个类生成一个默认的特殊成员函数。例:附上例代码://小问学编程#include<iostream>using namespace std;class A{public:原创 2021-02-01 00:10:34 · 254 阅读 · 2 评论 -
C++之初始化列表的一个笔记
以下代码出自大神的博文——构造函数与初始化列表初始化列表4.1作用:对数据成员进行初始化4.2格式:构造函数():变量名1(数值),变量名2(数值){} //!变量名不在花括号的后面,而是在花括号的前面#include <iostream>#include <string>using namespace std; class Cperson{public: Cperson() :_a(1), _b(3.14f), _c("we are csdn.原创 2021-02-01 10:45:16 · 221 阅读 · 0 评论 -
C++之关于初始化列表(Initialization List)的一个补充示例
本文说明:自己尚未从理论上完全掌握属于C++11新特性的初始化列表,本文仅是日常实际使用中的发现的一个细节总结。 直接上对比图第一种情况:最常用第二种情况:第三种情况:第四种情况:报错最后把前三种情况的图片放在一起方便对比:...原创 2020-12-08 14:09:35 · 317 阅读 · 0 评论 -
C++新特性探究(七):初始化列表(Initialization List)
在使用C++编程的过程当中,常常需要在构造函数中对类的成员变量进行初始化,通常的方法有两种: 第一种方法:在构造函数体内通过赋值语句初始化 Thing(int a,int b,int c) {x=a;y=b;z=c;} 第二种方法:使用初始化列表形式初始化 Thing(int a,int b,int c):x(a),y(b),z(ccc) { } 程序中为什么要使用初始化列表? (1) 对于类类型的成员,使用初始化列表效率更高。 (2) 有些类型的成员变量必须使用原创 2020-12-08 22:00:24 · 836 阅读 · 1 评论 -
C++新特性探究(六):auto
例1: 在上面的代码段中,a是整型,b是双精度型,那么通过编译器的分析,c就被定义成了双精度型。例2:auto也可以声明多个变量,但是需要注意的是,在同一行中要保证所有变量的类型一致,不能既有整行又有浮点型的变量。且看下面三行代码展示: 如上所示,在使用auto定义变量的时候,如果变量类型一致。可以同时这个变量的指针和引用,还能为定义的整型变量赋值。如果类型不一致或者引起歧义,那么定义就会报错。例3:auto变量定义的类型有时候也会被编译器转换。默认成自己认为合适的类型。例如: 这里,原创 2020-12-26 00:10:07 · 198 阅读 · 0 评论 -
C++新特性探究(一):nullptr
nullptr 出现的目的是为了替代 NULL。在某种意义上来说,传统 C++ 会把 NULL、0 视为同一种东西,这取决于编译器如何定义 NULL,有些编译器会将 NULL 定义为 ((void*)0),有些则会直接将其定义为 0。 C++ 不允许直接将 void * 隐式转换到其他类型,但如果 NULL 被定义为 ((void*)0),那么当编译 char *ch = NULL; 时,NULL 只好被定义为 0。而这依然会产生问题,将导致了 C++ 中重载特性会发生混乱。nullptr 是用.原创 2021-01-04 14:13:44 · 668 阅读 · 1 评论 -
C++新特性探究(二):override、final
“改写”(override)和“重载”(overload)读起来很像,尽管这是两个毫不相干的概念。——《Effective Modern C++》中文版 Page 79override 覆写父类的虚函数时候,好的IDE一定会给出斜体等的提示,表示此函数覆写自父类。——QT IDE斜体示例 若是在文本编辑器中,写错了,参数类型不对或个数不对,但是编译没问题,运行时候却和你设计的不一样不被调用,override 就是辅助你检查是否继承了想要虚继承的函数。关键字override 则指明,此种覆原创 2021-01-04 15:21:45 · 296 阅读 · 0 评论