【自用】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++中的虚拟继承的一些总结(虚拟继承,覆盖,派生,隐藏)

1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下: class A class B1:public virtual A; class B2:pu

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

嵌入式软件工程师应聘知识点

嵌入式软件工程师应聘 修改浏览权限 | 删除 数据结构(C语言)部分常考的知识点: 1、局部变量能、全局变量和静态变量 2、堆和栈 3、Const、volatile、define、typedef的用途 4、链表(比如链表的插入、删除和排序) 5、排序(考查冒泡法的较多) 6、可重入函数 、malloc函数 7、指针(常考函数指针,函数指针,数组指针,指针数组和

C++的模板(八):子系统

平常所见的大部分模板代码,模板所传的参数类型,到了模板里面,或实例化为对象,或嵌入模板内部结构中,或在模板内又派生了子类。不管怎样,最终他们在模板内,直接或间接,都实例化成对象了。 但这不是唯一的用法。试想一下。如果在模板内限制调用参数类型的构造函数会发生什么?参数类的对象在模板内无法构造。他们只能从模板的成员函数传入。模板不保存这些对象或者只保存他们的指针。因为构造函数被分离,这些指针在模板外

C++工程编译链接错误汇总VisualStudio

目录 一些小的知识点 make工具 可以使用windows下的事件查看器崩溃的地方 dumpbin工具查看dll是32位还是64位的 _MSC_VER .cc 和.cpp 【VC++目录中的包含目录】 vs 【C/C++常规中的附加包含目录】——头文件所在目录如何怎么添加,添加了以后搜索头文件就会到这些个路径下搜索了 include<> 和 include"" WinMain 和

C/C++的编译和链接过程

目录 从源文件生成可执行文件(书中第2章) 1.Preprocessing预处理——预处理器cpp 2.Compilation编译——编译器cll ps:vs中优化选项设置 3.Assembly汇编——汇编器as ps:vs中汇编输出文件设置 4.Linking链接——链接器ld 符号 模块,库 链接过程——链接器 链接过程 1.简单链接的例子 2.链接过程 3.地址和

C++必修:模版的入门到实践

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C++学习 贝蒂的主页:Betty’s blog 1. 泛型编程 首先让我们来思考一个问题,如何实现一个交换函数? void swap(int& x, int& y){int tmp = x;x = y;y = tmp;} 相信大家很快就能写出上面这段代码,但是如果要求这个交换函数支持字符型

十五.各设计模式总结与对比

1.各设计模式总结与对比 1.1.课程目标 1、 简要分析GoF 23种设计模式和设计原则,做整体认知。 2、 剖析Spirng的编程思想,启发思维,为之后深入学习Spring做铺垫。 3、 了解各设计模式之间的关联,解决设计模式混淆的问题。 1.2.内容定位 1、 掌握设计模式的"道" ,而不只是"术" 2、 道可道非常道,滴水石穿非一日之功,做好长期修炼的准备。 3、 不要为了

数据库期末复习知识点

A卷 1. 选择题(30') 2. 判断范式(10') 判断到第三范式 3. 程序填空(20') 4. 分析填空(15') 5. 写SQL(25') 5'一题 恶性 B卷 1. 单选(30') 2. 填空 (20') 3. 程序填空(20') 4. 写SQL(30') 知识点 第一章 数据库管理系统(DBMS)  主要功能 数据定义功能 (DDL, 数据定义语

C++入门01

1、.h和.cpp 源文件 (.cpp)源文件是C++程序的实际实现代码文件,其中包含了具体的函数和类的定义、实现以及其他相关的代码。主要特点如下:实现代码: 源文件中包含了函数、类的具体实现代码,用于实现程序的功能。编译单元: 源文件通常是一个编译单元,即单独编译的基本单位。每个源文件都会经过编译器的处理,生成对应的目标文件。包含头文件: 源文件可以通过#include指令引入头文件,以使