c++实战知识点
c++实战知识点
- 一、概述
- 1.数据
- 2.C++11的原始字面量
- 3.数据类型的别名
- 4.const修饰指针
- 5.void关键字
- 6.内存模型
- 7.二级指针
- 8.函数指针和回调函数
- 9.数组
- 10.C风格字符串
- 11.二维数组用于函数的参数
- 行指针(数组指针)
- 12.引用
- 引用与const
- 13.各种形参的使用场景
- 14.重载operator new 和 operator delete
- 15.内存池
- 二、继承
- 1.继承方式
- 2.继承的对象模型
- 3.名字遮蔽与类作用域
- 4.继承的特殊关系
- 5.运行阶段类型识别-dynamic cast
- 三、typeid运算符和type_info类
- 四、函数模板
- 1.函数模板的特化
- 2.关于函数模板的分文件编写
- 3.decltype关键字
- 4.函数后置返回类型
- 五、模板类
- 1.嵌套和递归使用模版类
- 2.模板类与继承
- 3.模板类与函数
- 4.模板类与友元
- 六、编译预处理
- 七、C++类型转换
- 八、容器
- 1.string容器
- 构造和析构
- string容器操作
- 2.vector容器
- 构造和析构
- vector容器操作
- 3.迭代器
- 4.关于容器中的范围for循环
- 5.list容器
- 构造函数
- 容器的操作
- 6.pair键值对
- 7.map
- 构造函数
- 容器的操作
- map的分段构造
- 8.unordered_map
- 构造函数(和map一样)
- 容器操作
- 9.queue容器
- 构造函数
- 容器操作
- 10.其他容器
- array
- set & multiset
- priority_queue
- 九、STL算法
- 1.for_each
- 2.find_if
- 3.sort
- 4.总结
- 十、函数对象
- 十一、智能指针
- 1.unique_ptr
- 2.shared_ptr
- 3.weak_ptr
- 4.智能指针的删除器
- 十二、文件操作
- 1.写文本文件
- 2.读文本文件
- 3.写二进制文件
- 4.读二进制文件
- 5.更多细节
- 6.文件的位置指针
- 7.文件缓冲区和流状态
- 十三、C++异常
- 十四、C++断言
- 十五、C++11新标准
- 1.long long 类型
- 2.char_16t和char_32t 类型
- 3.原始字面量
- 4.统一的初始化(列表)
- 5.自动推导类型auto
- 6.decltype关键字
- 7.函数后置返回类型
- 8.模板的别名
- 9.空指针nullptr
- 10.智能指针
- 11.异常
- 12.强类型枚举(枚举类)
- 13.explicit关键字
- 14.类内成员初始化
- 15.基于范围的for循环
- 16.新的STL容器
- 17.新的STL方法(成员函数)
- 18.摒弃export
- 19.嵌套模板的尖括号
- 20.final关键字
- 21.override关键字
- 22.数值类型和字符串之间的转换
- 23.静态断言
- 24.常量表达式constexpr
- 25.默认函数控制 =default 和 =delete
- 26.委托构造和继承构造
- 委托构造
- 继承构造
- 27.lambda表达式
- 28.右值引用
- 左值、右值
- 左值引用、右值引用
- 总结
- 29.移动语义
- 注意事项
- 30.完美转发
- 31.可变参数模板
- 十六、时间操作chrono库
- 时间长度
- 系统时间
- 定时器
一、概述
1.数据
数据的分类:数字、字符、字符串。
-
变量的作用域:
-
全局变量:在全部函数外面定义。在定义位置之后的任意函数中都能访问。
-
局部变量:在函数和语句块内部定义。在函数返回或语句块结束时由系统回收。
-
函数的参数是该函数的局部变量。
-
函数内部用static修饰的是静态局部变量。只执行初始化一次,直到程序运行结束回收。
静态局部变量作用域被限制在定义它们的函数内。这是因为静态局部变量的存在是为了保存函数内的状态,而不影响全局或外部状态。如果一个函数既可以用全局变量也可以用静态局部变量满足该函数要求,优先考虑静态局部变量,因为更安全。
- 字符的本质
- 字符的本质是整数,取值范围是0~127。
- 在书写的时候可以用单引号包含,也可以用整数。
- 可以与整数进行任何运算,运算的时候,可以用符号,也可以用整数。
- 在ASCII码表中,0~31是控制字符,只能用十进制表示,不能用符号表示。因此用转义字符来书写它们。

2.C++11的原始字面量

- 如果在字符串中存入路径,需要两个\\,以免一个\后面的字符被认为是控制字符。
- 如果路径过长,再输入一个\比较麻烦,因此用原始字面量。

- 此外,如果字符串过长,可以用原始字面量避免用连接符连接字符串,还可以顺便对齐格式。

3.数据类型的别名
4.const修饰指针
- 常量指针:const 数据类型 *变量名
- 不能通过解引用的方法修改内存地址中的值,可以用原始的变量名修改。

- 指针常量:数据类型 * const 变量名
- 指向的变量(对象)不可以改变。
- 在定义的同时必须初始化。
- 可以通过解引用修改内存地址中的值。
- 常指针常量:const 数据类型 * const 变量名
- 指向的对象不可改变,不能通过解引用的方法修改内存地址中的值
5.void关键字
- 函数的形参用void*,表示接受任意数据类型的指针。传入函数的指针不需要进行强制类型转换。
- 不能用void声明变量,它不代表一个真实的变量。
- 不能对void*指针直接解引用,需要转换为其他类型的指针。
- 把其他类型的指针赋值给void*指针不需要转换。
- 把void*指针赋值给其他类型的指针需要转换。
- 在C++中,在控制台打印字符型变量的地址会有bug。因此转换为void*类型再打印。

6.内存模型

7.二级指针
指针是指针变量的简称,也是一种变量,是变量就有地址。
指针用于存放普通变量的地址,二级指针用于存放指针变量的地址。
把普通变量的地址传入函数后可以在函数中修改变量的值,把指针的地址传入函数后可以在函数中修改指针的值。
也可以用一级指针加引用的方式修改指针变量。(把指针当成普通变量)
8.函数指针和回调函数
使用函数指针:
- 声明函数指针
- 让函数指针指向函数的地址
- 通过函数指针调用函数
实际业务:
回调函数。我们写回调函数的时候,只确定回调函数的种类,不关心具体的功能实现。
9.数组
- 关于为什么数组当函数参数传入函数,同时也要传数组的长度?
- 数组作为函数参数时被解释为指针。如果用sizeof(数组名),其实是指针的大小,8个字节,没办法得到数组实际的长度。

- 数组的排序(qsort)
- void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *))
- 参数:起始地址、元素个数、元素大小、回调函数地址


10.C风格字符串
- C语言:如果char类型的数组的末尾包含了\0,那么该数组中的内容就是一个字符串。

- 清空字符串:memst
字符查找strchr和字符串查找strstr

11.二维数组用于函数的参数
行指针(数组指针)
语法:数据类型 (*行指针名) [行的大小]
一维数组名被解释为数组第0个元素的地址。
数组名在大多数情况下会隐式转换为指向数组第一个元素的指针。这意味着数组名本身是一个指向数组首元素的指针。
对一维数组名取地址得到的是数组的地址,是行地址。
使用取地址运算符 & 对数组名取地址时,得到的是一个指向整个数组的指针(数组指针)。这是一个与数组名本身不同的指针类型。





12.引用
引用作为函数参数,可以避免使用二级指针。
引用与const
普通引用:只能绑定到左值。即,普通引用必须引用一个持久存在的对象。
const 引用:可以绑定到左值和右值(包括临时对象)。这是因为 const 引用不会修改其绑定的对象,因此它可以安全地引用临时对象。
如果函数的实参 不是左值 或 与const引用形参的类型不匹配,那么c++将创建正确类型的匿名变量,将实参的值传递给匿名变量,让形参来引用该变量。
假设我们有如下函数,右值作为实参:
void print(const std::string& str) { std::cout bar(); // 转换成功,可以调用 Derived 类的方法 } else { // 转换失败,derivedPtr 为 nullptr }- 失败的情况
cpp复制代码Base* basePtr = new AnotherDerived(); Derived* derivedPtr = dynamic_cast(basePtr); if (derivedPtr) { derivedPtr->bar(); // 不会执行,因为转换失败 } else { // 转换失败,derivedPtr 为 nullptr }- 引用转换
Base& baseRef = *basePtr; try { Derived& derivedRef = dynamic_cast(baseRef); derivedRef.bar(); // 如果转换成功,可以调用 Derived 类的方法 } catch (const std::bad_cast& e) { // 转换失败,抛出 std::bad_cast 异常 std::cerr
- 引用转换
- 失败的情况
- C语言:如果char类型的数组的末尾包含了\0,那么该数组中的内容就是一个字符串。
- 关于为什么数组当函数参数传入函数,同时也要传数组的长度?
- 指向的对象不可改变,不能通过解引用的方法修改内存地址中的值
- 常量指针:const 数据类型 *变量名
- 字符的本质
-
-










