【自用】C++ 知识点总结Ⅱ:异常、IO流、类型转化、C++11新特新、STL、设计模式...(待更新)

本文主要是介绍【自用】C++ 知识点总结Ⅱ:异常、IO流、类型转化、C++11新特新、STL、设计模式...(待更新),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 五、异常
  • 六、IO 流
  • 七、C++ 类型转化
      • static_cast
      • dynamic_cast
      • const_cast
      • reinterpret_cast
      • static_cast 和dynamic_cast 的区别?
  • 八、C++ 11
      • 智能指针🔺
        • 什么是循环引用?如何解决?解决原理?🔺
        • 定制删除器(少见)
      • lambda 🔺
        • lambda 的使用场景和优势🔺
        • lambda 底层实现原理是什么?🔺
      • 其他(了解)
  • 九、STL
  • 十、拓展


五、异常

  • 什么是异常?
  • 异常的优缺点是什么?

六、IO 流

从用的角度,掌握 文件流 和 字符串流。

七、C++ 类型转化

static_cast

  • 在编译时进行类型转换,而不进行运行时检查
  • 可以完成:基本数据类型转换、指针类型转换(基类指针转为派生类是不安全的)、类层次结构中的向上转换

dynamic_cast

  • 进行 运行时 类型检查,在运行的时候通过虚函数表指针去判断对象的实际类型
  • 主要用于在类继承层次结构中执行安全的向上或向下类型转换
  • 只能用于具有虚函数的类

const_cast

  • 将 const 类型的指针或引用转换为非 const 类型,可以修改本来是 const 的对象,需要小心使用
  • 可以将非 const 类型的指针或引用转换为 const 类型,这通常用于传递对象的只读引用或指针,以防止在函数内部修改对象。

reinterpret_cast

  • 是对比特位的简单拷贝并重新解释。
  • 很强大也很危险,不进行类型检查,他可以完成:指针之间、整数和指针之间、不同类型指针之间的转换…

static_cast 和dynamic_cast 的区别?

1.类型转换的时期

  • static_cast 是在编译时执行的类型转换
  • dynamic_cast 是在运行时执行的类型转换。它进行运行时类型检查,确保转换是安全的

2.安全性

  • static_cast 向下转换不安全:一个指向一个基类的指针转换为指向一个派生类的指针,但实际上该对象并不是派生类的实例,那么这个转换是不安全的
  • dynamic_cast 向下转换安全:运行的时候会检查如果基类指针或引用不指向派生类的对象,进行向下转换的时候,dynamic_cast 将返回 nullptr(对于指针),引发 std::bad_cast 异常(对于引用)

3.适用范围

  • static_cast 适用非多态类型的转换,基本数据类型之间的转换,指针类型之间的转换
  • dynamic_cast 主要用于处理多态类型之间的转换,对象必须包含至少一个虚函数

八、C++ 11

  • 右值引用和左值引用的区别?🔺
  • 移动构造和移动赋值🔺
  • 右值引用的使用场景?如何减少拷贝提高效率?🔺
    • 主要是返回值和参数,可以看看 push_back(T&& val) 的右值引用版本、传值返回的函数如 to_string()
  • 完美转发解决什么问题?
  • 智能指针发展历史?🔺

智能指针🔺

四种智能指针的原理?简单模拟实现 unique/shared

  • auto_ptr:管理权转移(C++98),通过拷贝构造函数和赋值重载函数来实现。
    • 原对象拷贝给新对象的时候,原对象就会被设置为nullptr,此时就只有新对象指向一块资源空间。
    • 会出现野指针问题。
  • unique_ptr:禁用拷贝构造和赋值构造(C++11)
    • unique_ptr(unique_ptr&) = delete;
    • operator=(unique_ptr&) = delete;
  • share_ptr:引用计数(C++11)
    • 计数的对象在堆上,所有线程都能访问,因此需要锁保证其安全性
    • 会出现循环引用的问题
  • weak_ptr
    • weak_ptr 类的对象它可以指向 shared_ptr,并且不会改变 shared_ptr 的引用计数
什么是循环引用?如何解决?解决原理?🔺
  • 如果使用 shared_ptr 定义双向链表节点中_prev 和 _next,两个节点互相引用的时候,就会出现循环引用的现象。
  • 使用 weak_ptr 类型定义结构体内的指针。
  • weak_ptr 类的对象它可以指向 shared_ptr,并且不会改变shared_ptr 的引用计数。一旦最后一个shared_ptr被销毁时,对象就会被释放。
定制删除器(少见)
  • 当我们释放一个指向数组的指针的时候,delete[] 后面的空方括号是必须存在,它指示编译器此指针指向的是一个对象数组的第一个元素,如果我们在 delete 一个指向数组的指针中忽略了方括号,我们的程序可能在执行过程中在没有任何警告下行为异常。

lambda 🔺

语法规则(现场写一个lambda)

[capture_list](parameters) mutable -> return_type{statement}
lambda 的使用场景和优势🔺
lambda 底层实现原理是什么?🔺
  • 底层编译器对于 lambda 表达式的处理方式,完全就是按照函数对象(仿函数)的方式处理的,该类中重载了 operator();
  • [=] 实际使用的值,才会在 lambda 类中作为成员变量初始化;
  • lambda_uuid 是 lambda 表达式底层的类型名称,编译器会给他们唯一标识的名称。

其他(了解)

  • 线程库
  • 列表初始化
  • STL中容器的变化
    • 新容器
    • 移动构造和移动赋值
    • 插入接口的变化:push_back(T&& val)、emplace…
  • 可变参数模板
  • auto
    • 可以在一行定义多个变量,编译器实际只对第一个类型进行推导,用推导出来的类型定义其余变量。
    • 编译器实际只对第一个类型进行推导,用推导出来的类型定义其余变量。
  • nullptr 和 NULL 有何区别?
    类型不同:NULL 是宏定义或整数值 0,而 nullptr 是 C++11 引入的关键字,表示空指针。
    安全性不同:NULL 可能导致函数调用二义性问题,nullptr 更安全,不会被错误解释为整型。
    上下文匹配不同:NULL 可以用于整型类型的上下文,nullptr 只能用于指针类型的上下文。

九、STL

👉🔗六大核心组件,重点部分掌握

十、拓展

  • 《effective C++》 ,一本相当好的学习资料
  • 《C++ primer》第五版,语法字典
  • 《STL 源码剖析》
  • 常见的设计模式
    • 单例、工厂、适配器模式、迭代器模式、观察者模式

这篇关于【自用】C++ 知识点总结Ⅱ:异常、IO流、类型转化、C++11新特新、STL、设计模式...(待更新)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/255882

相关文章

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

Java文件与Base64之间的转化方式

《Java文件与Base64之间的转化方式》这篇文章介绍了如何使用Java将文件(如图片、视频)转换为Base64编码,以及如何将Base64编码转换回文件,通过提供具体的工具类实现,作者希望帮助读者... 目录Java文件与Base64之间的转化1、文件转Base64工具类2、Base64转文件工具类3、

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

如何将二进制文件流转化为MockMultipartFile文件

《如何将二进制文件流转化为MockMultipartFile文件》文章主要介绍了如何使用Spring框架中的MockMultipartFile类来模拟文件上传,并处理上传逻辑,包括获取二进制文件流、创... 目录一、名词解释及业务解释1.具体业务流程2.转换对象解释1. MockMultipartFile2

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表