• 【自用】C++ 知识点总结Ⅱ:异常、IO流、类型转化、C++11新特新、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:弱关联性(C++11)
      • 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}
    
    • 1
    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 源码剖析》
    • 常见的设计模式
      • 单例、工厂、适配器模式、迭代器模式、观察者模式
  • 相关阅读:
    Github每日精选(第18期):聊天机器人ChatterBot
    Java Executors类的9种创建线程池的方法及应用场景分析
    Docker Swarm: 容器编排的力量和优势深度解析
    微慕积分商城插件
    【计算机毕业设计】Springboot医疗管理系统源码
    软考高项-质量大师的观点
    Python数据分析--Numpy常用函数介绍(3)
    程序员保密协议
    SpringCloud--链路追踪之Sleuth的简单使用
    Neo4j入门教程2(看不懂评论区随便骂)
  • 原文地址:https://blog.csdn.net/m0_67470729/article/details/133962458