c++实战知识点

2024-06-14 1011阅读

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是控制字符,只能用十进制表示,不能用符号表示。因此用转义字符来书写它们。
                                                      • c++实战知识点

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

                                                        • c++实战知识点
                                                        • 如果在字符串中存入路径,需要两个\\,以免一个\后面的字符被认为是控制字符。
                                                        • 如果路径过长,再输入一个\比较麻烦,因此用原始字面量。
                                                        • c++实战知识点
                                                        • 此外,如果字符串过长,可以用原始字面量避免用连接符连接字符串,还可以顺便对齐格式。
                                                        • c++实战知识点

                                                          3.数据类型的别名

                                                          c++实战知识点

                                                          4.const修饰指针

                                                          • 常量指针:const 数据类型 *变量名
                                                            • 不能通过解引用的方法修改内存地址中的值,可以用原始的变量名修改。
                                                            • c++实战知识点
                                                            • 指针常量:数据类型 * const 变量名
                                                              • 指向的变量(对象)不可以改变。
                                                              • 在定义的同时必须初始化。
                                                              • 可以通过解引用修改内存地址中的值。
                                                              • 常指针常量:const 数据类型 * const 变量名
                                                                • 指向的对象不可改变,不能通过解引用的方法修改内存地址中的值

                                                                  5.void关键字

                                                                  • 函数的形参用void*,表示接受任意数据类型的指针。传入函数的指针不需要进行强制类型转换。
                                                                  • 不能用void声明变量,它不代表一个真实的变量。
                                                                  • 不能对void*指针直接解引用,需要转换为其他类型的指针。
                                                                  • 把其他类型的指针赋值给void*指针不需要转换。
                                                                  • 把void*指针赋值给其他类型的指针需要转换。
                                                                  • 在C++中,在控制台打印字符型变量的地址会有bug。因此转换为void*类型再打印。
                                                                  • c++实战知识点

                                                                    6.内存模型

                                                                    • c++实战知识点

                                                                      7.二级指针

                                                                      指针是指针变量的简称,也是一种变量,是变量就有地址。

                                                                      指针用于存放普通变量的地址,二级指针用于存放指针变量的地址。

                                                                      c++实战知识点

                                                                      把普通变量的地址传入函数后可以在函数中修改变量的值,把指针的地址传入函数后可以在函数中修改指针的值。

                                                                      c++实战知识点

                                                                      也可以用一级指针加引用的方式修改指针变量。(把指针当成普通变量)

                                                                      c++实战知识点

                                                                      8.函数指针和回调函数

                                                                      使用函数指针:

                                                                      • 声明函数指针
                                                                      • 让函数指针指向函数的地址
                                                                      • 通过函数指针调用函数

                                                                        c++实战知识点

                                                                        实际业务:

                                                                        回调函数。我们写回调函数的时候,只确定回调函数的种类,不关心具体的功能实现。

                                                                        c++实战知识点

                                                                        c++实战知识点

                                                                        9.数组

                                                                        • 关于为什么数组当函数参数传入函数,同时也要传数组的长度?
                                                                          • 数组作为函数参数时被解释为指针。如果用sizeof(数组名),其实是指针的大小,8个字节,没办法得到数组实际的长度。
                                                                          • c++实战知识点
                                                                          • 数组的排序(qsort)
                                                                            • void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *))
                                                                            • 参数:起始地址、元素个数、元素大小、回调函数地址
                                                                            • c++实战知识点
                                                                            • c++实战知识点

                                                                              10.C风格字符串

                                                                              • C语言:如果char类型的数组的末尾包含了\0,那么该数组中的内容就是一个字符串。
                                                                                • c++实战知识点
                                                                                • 清空字符串:memst

                                                                                  c++实战知识点

                                                                                  字符查找strchr和字符串查找strstr

                                                                                  • c++实战知识点

                                                                                    11.二维数组用于函数的参数

                                                                                    行指针(数组指针)

                                                                                    语法:数据类型 (*行指针名) [行的大小]

                                                                                    c++实战知识点

                                                                                    一维数组名被解释为数组第0个元素的地址。

                                                                                    数组名在大多数情况下会隐式转换为指向数组第一个元素的指针。这意味着数组名本身是一个指向数组首元素的指针。

                                                                                    c++实战知识点

                                                                                    对一维数组名取地址得到的是数组的地址,是行地址。

                                                                                    使用取地址运算符 & 对数组名取地址时,得到的是一个指向整个数组的指针(数组指针)。这是一个与数组名本身不同的指针类型。

                                                                                    • c++实战知识点
                                                                                    • c++实战知识点
                                                                                    • c++实战知识点
                                                                                    • c++实战知识点
                                                                                    • c++实战知识点

                                                                                      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 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]