【C++基础】C++11的新特性

这篇具有很好参考价值的文章主要介绍了【C++基础】C++11的新特性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、C++11新特性

C++新特性主要包括包含语法改进和标准库扩充两个方面,主要包括以下11点

1、语法的改进

1)统一的初始化方法

在 C++11 中,可以直接在变量名后面跟上初始化列表,来进行对象的初始化

2)成员变量默认初始化
3)auto关键字** 用于定义变量,编译器可以自动判断的类型(前提:定义一个变量时对其进行初始化)
4)decltype 求表达式的类型
5)智能指针 shared_ptr

和 unique_ptr、weak_ptr 不同之处在于,多个 shared_ptr 智能指针可以共同使用同一块堆内存。并且,由于该类型智能指针在实现上采用的是引用计数机制,即便有一个 shared_ptr 指针放弃了堆内存的“使用权”(引用计数减 1),也不会影响其他指向同一堆内存的 shared_ptr 指针(只有引用计数为 0 时,堆内存才会被自动释放)

6)空指针 nullptr(原来NULL)
7)基于范围的for循环
8)右值引用和move语义
  • 右值引用
//左值引用
int num = 10;
int &b = num;  //正确
int &c = 10;   //错误,在C++98/03标准中,无法为右值添加引用

实际开发中可能需要对右值进行修改(实现移动语义时就需要),显然左值引用的方式是行不通的。为此,C++11 标准新引入了另一种引用方式,称为右值引用,用 “&&” 表示。

int num = 10;
//int && a = num;  //右值引用不能初始化为左值
int && a = 10;
  • move语义

在C++11中,标准库在中提供了一个有用的函数std::move,std::move()函数并不能移动任何东西,它唯一的功能是将一个左值引用强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义。从实现上讲,std::move基本等同于一个类型转换:static_cast<T&&>(lvalue);

move( arg ) //其中,arg 表示指定的左值对象。该函数会返回 arg 对象的右值形式。

2、标准库扩充(往STL里新加进一些模板类,比较好用)

9)无序容器(哈希表)

用法和功能同map一模一样,区别在于哈希表的效率更高

10)正则表达式

可以认为正则表达式实质上是一个字符串,该字符串描述了一种特定模式的字符串

11)Lambda表达式

lambda表达式是一个匿名函数,用于定义并创建匿名的函数对象,以简化编程工作。举个例子:

 vector<int> vec;
 sort(vec.begin(), vec.end(), cmp); // 旧式
 sort(vec.begin(), vec.end(), [](int a, int b) -> bool { return a < b; });   // Lambda表达式

声明lambda表达式

[capture list] (params list) mutable exception-> return type { function body }
  • capture list:捕获外部变量列表
  • params list:形参列表
  • mutable指示符:用来说用是否可以修改捕获的变量
  • exception:异常设定
  • return type:返回类型
  • function body:函数体

二、智能指针

为什么要使用智能指针:
智能指针的作用是管理一个指针,因为存在申请的空间在函数结束时忘记释放,造成内存泄漏的情况。使用智能指针可以很大程度上避免这个问题,因为智能指针就是一个类,当超出了类的作用域时,类会自动调用析构函数,自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间
智能指针的作用:处理内存泄漏问题和空悬指针问题。

C++中的智能指针有4种,分别为:shared_ptr、unique_ptr、weak_ptr、auto_ptr,其中auto_ptr被C++11弃用。

  • 对于shared_ptr,可解决资源忘记释放的内存泄漏问题,及悬空指针问题。
    *shared_ptr实现共享式拥有的概念,多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁”时候释放。从名字share就可以看出了资源可以被多个指针共享,它使用计数机制来表明资源被几个指针共享。

  • 对于unique_ptr,对象对其有唯一所有权。
    unique_ptr实现独占式拥有的概念,同一时间只能有一个智能指针可以指向该对象,它对于避免资源泄露,因为无法进行拷贝构造和拷贝赋值,但是可以进行移动构造和移动赋值。

  • 对于weak_ptr,和 shared_ptr 搭配,不会增加引用计数,用于避免循环引用(比如 a 对象持有 b 对象,b 对象持有 a 对象),这样必然会导致内存泄露。
    解决shared_ptr相互引用时,两个指针的引用计数永远不会下降为0,从而导致死锁问题。而weak_ptr是对对象的一种弱引用,可以绑定到shared_ptr,但不会增加对象的引用计数

  • 对于auto_ptr,实现独占式拥有的概念,同一时间只能有一个智能指针可以指向该对象;但auto_ptr在C++11中被摒弃,其主要问题在于:
    1)对象所有权的转移,比如在函数传参过程中,对象所有权不会返还,从而存在潜在的内存崩溃问题;
    2)不能指向数组,也不能作为STL容器的成员文章来源地址https://www.toymoban.com/news/detail-600058.html

到了这里,关于【C++基础】C++11的新特性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c++ 11 新特性 不同数据类型之间转换函数之reinterpret_cast

    一.不同数据类型之间转换函数 reinterpret_cast 介绍 reinterpret_cast 是C++中的一种类型转换操作符,用于执行低级别的位模式转换。具体来说, reinterpret_cast 可以实现以下功能: 指针和整数之间的转换 :这种转换通常用于在指针中存储额外信息,或者在特定平台上进行底层操作。

    2024年03月09日
    浏览(40)
  • C语言每日一题:11.《数据结构》链表分割。

    题目链接: 1.构建两个新的带头链表,头节点不存储数据。 2.循环遍历原来的链表。 3.小于x的尾插到第一个链表。 4.大于等于x尾插到第二个链表。 5.进行链表合并,注意第二个链表的尾的下一个需要置空防止成环。 6.free两个头之前需要保存新的满足条件的单链表的头。 1.有

    2024年02月14日
    浏览(44)
  • 数据结构—基础知识(11):二叉树的遍历

    二叉树的遍历 是指按某条搜索路径访问树中每个结点,使得每个结点均被访问一次,而且仅被访问一次。由于二叉树是一种非线性结构,每个结点都可能有两棵子树,因而需要寻找一种规律,以便使二叉树上的结点能排列在一个线性队列上,进而便于遍历。 由二叉树的递归

    2024年02月19日
    浏览(44)
  • 深入理解ArkTS:Harmony OS 应用开发语言 TypeScript 的基础语法和关键特性

    Harmony OS应用开发的主力语言ArkTS的前身TS语言的基本语法。通过学习变量的声明和数据类型、条件控制、函数声明、循环迭代等基本知识,并了解内核接口的声明和使用。同时还介绍了模块化开发的概念,提高代码的复用性和开发效率。该对话还涉及了if else和switch条件控制语

    2024年02月04日
    浏览(46)
  • 第11章:C语言数据结构与算法初阶之排序

    排序是一种非常重要的算法。 排序 :所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 稳定性 :假定在待排序的记录序列中,存在多个具有相同的的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,

    2024年02月12日
    浏览(44)
  • php5.0到5.6的新特性,开发时应注意版本的兼容性

    php5.0 使用了Zend 2 引擎。 增加完善的面向对象模型 增加了新,包括this,try,catch,public,private,protected等 改变strrpos() 和 strripos()使用整个字符串作为 needle。 改变array_merge() 只接受数组 改变非法使用字符串偏移量会导致 E_ERROR 而不是 E_WARNING 改变get_class(),get_parent_class()和get

    2024年01月25日
    浏览(45)
  • c++基础数据结构

    基础数据结构 目录 • 线性结构 • 二叉堆 • 并查集 • 哈希表 • 应用举例 一、线性结构 基础知识 • 数组 • 带头结点的双链表 – He a d 结点 : 虚拟头结点 – Fir s t 结点 : 第一个有实际内容的结点 • 队列 : 循环队列与 Open-Close 表 例 1. 最小值 • 实现一个 n 个元素的线性

    2024年02月10日
    浏览(37)
  • 【C++】C++11特性

    1.1 {}初始化 C++11引入了初始化列表(Initializer lists)的特性,通过花括号 {} 可以方便地初始化数组、容器和自定义类型的成员变量。这种语法可以一次性地指定多个初始值,而不需要显式地编写多个赋值语句。 下面是一些示例用法: 初始化数组: 初始化容器(如std::vector)

    2024年02月16日
    浏览(35)
  • C++基础-介绍·数据结构·排序·算法

    C++是一门风格严谨又不失自由的开发语言,提供了完整的内存管理、支持函数式编程和面向对象编程,支持模板、多继承、多实现、重载、重写等多态特性。 优势在于目前90%的操作系统、数据库、应用基础架构、硬件嵌入式等都是使用C/C++制作的,而C++是对C的标准扩展,掌握

    2024年02月03日
    浏览(43)
  • C++ 11新特性之并发

    概述         随着计算机硬件的发展,多核处理器已经成为主流,对程序并发执行能力的需求日益增长。C++ 11标准引入了一套全面且强大的并发编程支持库,为开发者提供了一个安全、高效地利用多核CPU资源进行并行计算的新框架,极大地简化了多线程开发。 std::thread  

    2024年02月20日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包