C++11新特性
文章平均质量分 96
寂寂寂寂寂蝶丶
这个作者很懒,什么都没留下…
展开
-
移动
转载自:《C++primer》重新分配内存时,使用移动而不是拷贝元素编写reallocate成员函数之前,先思考下此函数需要做什么,该函数可以理解为vector<string>类型成员在当前容量使用光之后进行扩展存储的过程。为一个新的、更大的string数组分配内存 在内存空间的前一部分构造对象,保存现有元素 销毁原内存空间中的元素,并释放这块内存可以看出为一个StrVec重新分配内存空间会引起从旧内存空间到新内存空间逐个拷贝string,当拷贝一个string时,新strin原创 2020-12-01 22:20:30 · 528 阅读 · 1 评论 -
右值引用、move函数
右值引用为了支持移动操作,新标准引入了一种新的引用类型----右值引用(rvalue reference),所谓右值引用就是必须绑定到右值的引用。我们通过&&而不是&来获得右值引用,右值引用有一个重要的性质----只能绑定到一个将要销毁的对象。因此,我们可以自由地将一个右值引用的资源“移动”到另一个对象中。一般而言,一个左值表达式表示的是一个对象的身份,而一个右值表达式表示的是对象的值,类似任何引用,右值引用也是某个对象的另一个名字,对于常规引用(左值引用),不能将其绑定到要原创 2020-11-30 21:56:14 · 634 阅读 · 0 评论 -
可调用对象与function类模板(定义同一调用形式的可调用对象)
C++中的几种可调用对象1.函数2.函数指针3.lambda表达式4.bind创建的对象5.重载了函数调用运算符()的类和其他对象一样,可调用的对象也有类型,每个lambda有它自己唯一的(未命名)类类型,函数及函数指针的类型则由其返回值类型和实参类型决定,然而俩个不同的类型的可调用对象却可能共享同一种调用形式,调用形式指明了返回的类型以及传递给调用的实参类型。不同类型可能具有相同的调用形式,对于几个可调用对象共享同一个调用形式的情况,有时我们会希望把它们看成具有相同的类型。上面这些原创 2020-11-28 21:06:33 · 324 阅读 · 0 评论 -
参数绑定bind、bind1st、bind2nd以及ptr_fun、mem_fun、mem_fun_ref的使用
对于那种只在一俩个地方使用的简单操作,lambda表达式是最有用的,如果我们需要在很多地方使用相同的操作,通常应该定义一个函数,而不是多次编写相同的lambda表达式,如果一个操作需要很多语句才能完成,通常使用函数更好。标准库bind函数使用场景将函数转换为泛型算法适用的参数:例如用在find_if调用中的lambda比较一个string和一个给定大小,我们可以很容易地编写一个完成同样工作的函数bool check_size(const string& s, string::size原创 2020-11-28 19:46:37 · 956 阅读 · 0 评论 -
lambda表达式
一个lambda表达式表示一个可调用的代码单元,我们可以将其理解为一个未命名的内联函数,与任何函数类似,一个lambda具有一个返回类型、一个参数列表和一个函数体,但与函数不同,lambda可能定义在函数内部,而且lambda必须使用尾置返回。lambda表达式形式:[capture list] (parameter list) opt-> return type {function body}1. capture list:捕获列表,是一个lambda所在函数中定义的局部变量的列表(通常原创 2020-11-27 15:35:28 · 276 阅读 · 1 评论 -
智能指针的内部实现、循环引用(weak_ptr解决)
转载自:https://blog.csdn.net/i_chaoren/article/details/82586456https://www.jianshu.com/p/11389ccbcf79https://blog.csdn.net/daniel_ustc/article/details/23096229智能指针的内部实现智能指针最终的实现是 两个指针成员:一个指向数据成员,一个指向计数器成员 智能指针里的计数器 维护的是一个指针,指向的 实际内存 在堆上,不是栈上的智能指针拷贝构造的原理原创 2020-11-25 18:04:45 · 630 阅读 · 0 评论 -
智能指针unique_ptr与weak_ptr
unique_ptr :一个unique_ptr"拥有"它所指向的对象,与shared_ptr不同,某个时刻只能有一个unique_ptr指向一个给定对象,当unique_ptr被销毁时,它所指向的对象也被销毁,与shared_ptr不同,没有类似make_shared的标准库函数返回一个unique_ptr,当我们定义一个unique_ptr时,需要将其绑定到一个new返回的指针上初始化un...原创 2019-04-09 18:05:37 · 439 阅读 · 0 评论 -
动态内存与智能指针shared_ptr
动态内存的管理是通过new delete运算符来完成的,使用不当会造成内存泄漏或者二次释放指针造成引用非法指针,为了更容易地使用动态内存,新的标准库提供了俩种智能指针类型来管理动态对象,智能指针与常规指针的重要区别是它负责自动释放所指向的对象,新标准库提供的这两种智能指针的区别在于管理底层指针的方式:shared_ptr允许多个指针指向同一个对象,unique_ptr则“独占”所指向...原创 2019-04-09 17:29:51 · 278 阅读 · 0 评论 -
与容器相关的函数与结构
标准库的begin和end函数 为了让指针使用更简单、更安全,C++11引入俩个名为begin和end的函数,这俩个函数与容器中的俩个同名成员功能类似,不过数组毕竟不是类类型,因此这俩个函数不是成员函数,正确的使用形式是将数组作为他们的参数。这俩个函数定义在iterator头文件中,使用begin和end可以很容易地写出一个循环并处理数组中的元素。int ia[] =...原创 2019-04-03 16:58:18 · 222 阅读 · 0 评论 -
列表初始化{}
无论是初始化对象还是某些时候为对象赋新值,都可以使用这样一组由花括号括起来的初始值了,当使用内置类型的变量时,这种初始化形式有一个重要特点,如果我们使用列表初始化且初始值存在丢失信息的风险,则编译器报错。long double ld = 3.1415926536int a{ ld }, b = { ld }; //错误:转换未执行,因为存在丢失信息的危险int ...原创 2019-04-03 17:15:25 · 524 阅读 · 0 评论 -
=default生成默认构造函数、委托构造函数、=delete定义删除函数
=default使用 = default生成默认构造函数:class Sales_data{public: //拷贝控制成员 使用default Sales_data() = default; Sales_data(const Sales_data&) = default; Sales_data& operator=(const Sales_data&)...原创 2019-03-19 12:16:59 · 738 阅读 · 0 评论 -
范围for语句
范围for语句遍历给定序列中每个元素并对序列中的每个值执行某种操作其语法形式是:for (declaration : expression)statement其中expression部分是一个对象,用于表示一个序列,比如用花括号括起来的初始值列表、数组、vector、string等类型的对象,这些类型的共同特点是拥有能返回迭代器的begin和end成员,declaration部分负责...原创 2019-03-18 20:39:40 · 448 阅读 · 0 评论 -
类型别名声明using、类型说明符auto、类型指示符decltype、尾置返回类型->
usingusing的用法:using 类型名 = 定义的类型的别名;using SI = Sales_item; //SI是Sales_item的同义词指针、常量和类型别名:如果某个类型别名指代的是复合类型或常量,那么把它用到声明语句里就会产生意想不到的后果例如下面的声明语句用到了类型pstring,它实际上是类型char*的别名typedef char* pstring;...原创 2019-03-18 20:30:16 · 526 阅读 · 0 评论 -
constexpr类型、空指针nullptr
常量表达式:是指值不会改变并且在编译过程就能得到计算结果的表达式,一个对象(或表达式)是不是常量表达式由它的数据类型和初始值共同决定。const int max_files = 20; //max_files是常量表达式const int limit = max_files + 1; //limit是常量表达式int staff_size = 27; //staff_size不是常...原创 2019-03-18 18:14:36 · 221 阅读 · 0 评论 -
using在继承构造函数中的用法(c++11)
参考自:https://blog.csdn.net/K346K346/article/details/81703914首先基类的构造函数和析构函数是不能被子类所继承的,之所以叫继承构造函数,实则含义是子类继承父类后,子类的构造函数所调用父类构造函数的一种方式。子类为完成基类初始化(基类中没有默认的无参构造函数的情况下),在C++11之前,需要在初始化列表调用基类的构造函数,从而完成构造函数...转载 2019-03-21 17:29:10 · 4483 阅读 · 1 评论