![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++ 新特性
文章平均质量分 75
小飞侠hello
这个作者很懒,什么都没留下…
展开
-
c++11 thread
std::thread对象析构时,会先判断是否可joinable(),如果可联结,则程序会直接被终止出错。构造std::thread对象时,如果不带参则会创建一个空的thread对象,但底层线程并没有真正被创建,一般可将其他std::thread对象通过move移入其中;因为调用join()以后,底层线程己结束,而detach()会把std::thread对象和对应的底层线程之间的连接断开。用于判断std::thread对象联结状态,一个std::thread对象只可能处于可联结或不可联结两种状态之一。原创 2022-11-10 22:46:54 · 1229 阅读 · 0 评论 -
c++ 类与默认函数、包括构造函数和析构函数的特点
构造函数和析构函数不能被继承,但子类可以调用基类的构造函数和析构函数.构造函数和析构函数是用来处理对象的创建和析构的,它们只知道对在它们的特殊层次的对象做什么。所以,在整个层次中的所有的构造函数和析构函数都必须被调用,也就是说,构造函数和析构函数不能被继承。子类的构造函数会显示的调用父类的构造函数或隐式的调用父类的默认的构造函数进行父类部分的初始化。析构函数也一样。它们都是每个类都有的东西,如果能被继承,那就没有办法初始化了。不是所有的函数都能自动地从基类继承到派生类中的。在创建子类对象时,为原创 2021-09-10 17:54:39 · 578 阅读 · 0 评论 -
c++ 常量表达式
编译时常量和运行时常量constexpr:编译时常量,在编译期就可以算出来。const : const并未区分出编译期常量和运行期常量,它限定一个变量不允许被改(但这个东西仍然可能是个动态变量,如做函数参数)。在大多数情况下,const描述的是运行时常量性。constexpr int getconst() { return 2;};void cofunc() { int arr[getconst()] = {0};};常量表达式主要是允许一些计算发生在编译时,即发...原创 2022-04-11 18:45:57 · 1381 阅读 · 0 评论 -
c++ 智能指针auto_ptr (c++98)、shared_ptr(c++ 11)、unique_ptr(c++ 11)、weak_ptr(c++ 11)
auto_ptr就是动态分配对象以及当对象不再需要时自动执行清理。使用std::auto_ptr,要#include <memory>。构造和析构1.将已存在的指向动态内存的普通指针作为参数来构造int*p=newint(0);auto_ptr<int>ap(p);2.直接构造智能指针auto_ptr< int > api( new int( 0) );因为auto_ptr析构的时候肯定会删除他所拥有的那个对象,两个auto......原创 2020-07-01 16:10:14 · 1457 阅读 · 0 评论 -
C++11强类型枚举——枚举类
传统C++中枚举常量1.被暴漏在外层作用域中,这样若是同一作用域下有两个不同的枚举类型,但含有相同的枚举常量也是不可的,比如:enum Side{Right,Left};enum Thing{Wrong,Right};2.另外一个缺陷是传统枚举值总是被隐式转换为整形,用户无法自定义类型。强类型枚举 强类型枚举使用enum class语法来声明,强类型枚举值具有传统枚举的功能——命名枚举值,同时又具有类的特点——具有类域的成员和无法进行默认的类型转换。所以也称之为枚举类——enmu ..原创 2021-09-09 11:18:27 · 316 阅读 · 0 评论 -
什么是 POD 数据类型
背景:几乎所有的系统底层都是用 C 写的,当时定义的基本数据类型有 int、char、float 等整数类型、浮点类型、枚举、void、指针、数组、结构等等,编译器都可以正确的把它解析出来。到了 C++ 诞生之后,出现了继承、派生这样新的概念,于是就诞生了一些新的数据结构。比如某个派生类,C 语言中哪有派生的概念啊,遇到这种数据编译器就不认识了。为了和旧的 C 数据相兼容,C++ 就提出了 POD 数据结构概念。POD 是 Plain Old Data 的缩写,Plain 代表它是一个普通类型,Ol原创 2021-09-09 09:55:31 · 843 阅读 · 0 评论 -
C++11 外部模板
在C++98/03语言标准中,对于源代码中出现的每一处模板实例化,编译器都需要去做实例化的工作;而在链接时,链接器还需要移除重复的实例化代码。显然,让编译器每次都去进行重复的实例化工作显然是不必要的,并且连接器也因此受累。显示实例化语法:template class vector<MyClass>;外部模板语法:extern template class vector<MyClass>;一旦在一个编译单元中使用了外部模板声明(如extern template class ve原创 2021-09-08 15:37:58 · 354 阅读 · 0 评论 -
c++ 17 新特性理解
1构造函数模板推导在C++17前构造一个模板类对象需要指明类型:pair<int, double> p(1, 2.2); // before c++17C++17就不需要特殊指定,直接可以推导出类型,代码如下:pair p(1, 2.2); // c++17 自动推导vector v = {1, 2, 3}; // c++17......原创 2021-09-22 10:54:46 · 1431 阅读 · 0 评论 -
c++ 14 新特性
1.函数返回值推导auto func_one(int i) {return i;}// 模板中也可以这样玩template<typename T> auto func_one(T t){ return t;}cout << func_one(2) << " " << func_one<double>(5.5) << endl; //...原创 2021-09-16 10:09:18 · 389 阅读 · 0 评论 -
std::bind
std::bind是函数模板(是一个函数);使用std::bind可以将可调用对象和参数一起绑定,绑定后的结果使用std::function进行保存,并延迟调用到任何我们需要的时候。std::bind返回一个基于f的函数对象,其参数被绑定到args上。f的参数要么被绑定到值,要么被绑定到placeholders(占位符,如_1, _2, ..., _n)。即;可将std::bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。std:原创 2022-02-24 11:22:26 · 38843 阅读 · 0 评论 -
c++11 function
讲std::function前首先需要了解下什么是可调用对象满足以下条件之一就可称为可调用对象:是一个函数指针是一个具有operator()成员函数的类对象(传说中的仿函数),lambda表达式是一个可被转换为函数指针的类对象是一个类成员(函数)指针bind表达式或其它函数对象而std::function就是上面这种可调用对象的封装器,可以把std::function看做一个函数对象,用于表示函数这个抽象概念。std::function的实例可以存储、复制和调用任何可调用对象原创 2022-02-23 18:04:21 · 679 阅读 · 0 评论 -
c++ final
控制力更强。如果一开始就不想派生,最开始的基类设置为非虚函数就可以了,final一般用于中途终止派生。作用是1.禁用重写使派生类重写该虚函数。class Super{ public: Supe(); virtual void SomeMethod() final;};2.禁用继承用来修饰类,让该类不能被继承.class Super final{ //......};class XiaoMi {public: XiaoMi(){}};...原创 2022-02-23 17:09:12 · 4891 阅读 · 1 评论 -
C++11 static_assert 使用方法及assert 与 #error
assert是运行期断言,它用来发现运行期间的错误,不能提前到编译期发现错误,也不具有强制性,也谈不上改善编译信息的可读性。既然是运行期检查,对性能肯定是有影响的,所以经常在发行版本中,assert都会被关掉。#error可看作是预编译期断言(甚至都算不上断言),仅仅能在预编译时显示一个错误信息,可以配合#ifdef/ifndef参与预编译的条件检查。由于它无法获得编译信息,当然,也就做不了更进一步分析了。C++11中引入了static_assert这个关键字,用来做编译期间的断言,因此原创 2021-09-07 17:32:45 · 1095 阅读 · 0 评论 -
c++ 11 之lambda
lambda被用来表示一种匿名函数,这种匿名函数代表了一种所谓的lambda calculus。以lambda概念为基础的”函数式编程“是与命令式编程、面向对象编程等并列的一种编程范型。[capture](parameters)mutable ->return-type{statement}其中,[capture] :捕捉列表,[]是lambda引出符,编译器根据该引出符判断接下来的代码是否是lambda函数。捕捉列表用于捕捉父域中的变量以供lambda函数使用,[var]表示以值..原创 2021-09-02 17:02:39 · 348 阅读 · 0 评论 -
c++11中using的使用
用法一:命名空间这种用法估计使用最多的,为了防止定义变量名、函数名冲突,把它们定义在一个命名空间内,使用的时候需要进行命名空间的申明:using namespace std;用法二:alias的使用using 还可以指定别名,比如using SO3d = SO3<double>; 那么它和typedef ,有什么区别?可读性我们使用typedef定义函数指针:typedef void (* FUN_) (int, int); 函数指针指向的函数返回值是void,输入参数是int.原创 2021-09-02 15:19:54 · 2996 阅读 · 0 评论 -
C++11列表初始化
C++11中可以直接在变量名后面加上初始化列表来进行对象的初始化。int a{1};int b[] {1,2};说下聚合类型可以进行直接列表初始化,这里需要了解什么是聚合类型: 类型是一个普通数组,如int[5],char[],double[]等 类型是一个类,且满足以下条件: 有用户声明的构造函数 没有用户提供的构造函数(允许显示预置或弃置的构造函数) 没有私有或保护的非静态数据成员 没有基类 没有虚函数原创 2021-09-02 11:31:12 · 587 阅读 · 0 评论 -
c++ 11 新特性之 左值右值
左值:可以取地址并且有名字的东西就是左值。或者可以放到等号左边的东西叫左值。 右值:不能取地址的没有名字的东西就是右值。或者不可以放到等号左边的东西就叫右值。 纯右值:运算表达式产生的临时变量、不和对象关联的原始字面量、非引用返回的临时变量、lambda表达式等都是纯右值。 将亡值:可以理解为即将要销毁的值。 左值引用:对左值进行引用的类型。 右值引用:对右值进行引用的类型。 移动语义:转移资源所有权,类似于转让或者资源窃取的意思,对于那块资源..原创 2021-09-01 17:58:15 · 1036 阅读 · 0 评论 -
c++ 11 新特性讲解大全
最近看了一段程序,是基于C++11/14编写的,非常符合代码规范(非常抽象==),看后叹为观止,越发觉得自己只会/只看得懂最基础的类和对象,惭愧。其中,代码中发现了好几个std::函数,感觉非常有趣,于是记录一下。函数 解释 可参考的详细链接std::move将左值强制转化为右值引用 。被move之后的原指针为空。 std::bind 直白来说就是把函数和入参一起放入。1)第一个参数:可调用的对象f,通常为函数。2)后续参数:函数的入参,一般按照顺序依次给入,或者.........原创 2021-07-09 10:29:28 · 1232 阅读 · 0 评论