当前位置: 首页 > news >正文

C++复习

📚 C++核心知识点超详细整理

🔤 基础语法与数据类型
变量与常量
  • 变量作用域与存储类别
    • 局部变量:定义在函数或代码块内,作用域仅限当前代码块,存储在栈区,离开作用域自动销毁。
    • 静态局部变量:用static修饰,存储在全局/静态区,初始化一次,生命周期持续整个程序,但作用域仍为当前代码块。
    • 全局变量:定义在所有函数外,作用域为整个程序,存储在全局/静态区,生命周期持续整个程序。
    • 静态全局变量:用static修饰,作用域仅限当前文件,避免不同文件的全局变量冲突。
  • 常量定义方式对比
    定义方式类型安全作用阶段适用场景
    const常量编译阶段需要类型检查的常量
    #define预处理阶段简单数值常量、代码片段替换
    enum枚举编译阶段相关常量集合
数据类型与类型转换
  • 基本数据类型内存大小(64位系统):
    类型大小(字节)范围
    bool1true/false
    char1-128~127
    short2-32768~32767
    int4-2^31~2^31-1
    long8-2^63~2^63-1
    float46~7位有效数字
    double815~16位有效数字
  • 类型转换规则
    • 隐式类型转换:低精度类型自动转换为高精度类型,如int转换为double
    • 显式类型转换:通过static_castconst_cast等进行强制转换,C风格转换(如(int)3.14)不推荐,因为缺乏类型检查。
🔀 控制流程深度解析
分支结构
  • 三目运算符细节
    • 语法:condition ? expr1 : expr2,右结合性,优先级低于算术和关系运算符,建议加括号明确逻辑。
    • 适用场景:仅适合简单二选一的场景,复杂逻辑建议使用if-else
  • if-else核心坑点
    • else默认与最近的未配对if结合,建议用大括号明确逻辑范围,避免匹配错误。
    • 非零即真规则:C++中任何非零值都被视为真,零值被视为假,布尔值true等价于1,false等价于0。
  • switch语句高级用法
    • 表达式类型限制:只能是整型、字符型、布尔型或枚举类型,不能是浮点数或字符串。
    • 贯穿问题:case块末尾必须加break,否则会从匹配的case开始执行后续所有代码。
    • 多值同逻辑:多个case可以共用一段代码,如case 1: case 2: cout << "工作日"; break;
循环结构
  • 三种循环对比
    循环类型适用场景注意事项
    for已知循环次数循环变量前置定义,减少重复创建
    while未知循环次数,可能不执行避免循环内重复计算条件表达式
    do-while未知循环次数,至少执行一次注意循环条件后面的分号
  • 循环控制进阶
    • break:跳出当前循环,若嵌套循环则只跳出最内层。
    • continue:跳过本次循环剩余代码,直接进入下一次循环迭代。
    • goto:可以跳出多层循环,但滥用会导致代码可读性下降,建议谨慎使用,可优先考虑设置标志变量。
📦 函数与面向对象进阶
函数核心特性
  • 函数重载匹配规则
    • 精确匹配优先,其次是常量转换、提升转换、标准转换。
    • 返回值类型不影响重载匹配,只有参数的类型、个数、顺序不同才会构成重载。
  • 递归函数优化
    • 尾递归:递归调用是函数的最后操作,部分编译器会将其优化为循环,避免栈溢出。
    • 终止条件:必须明确,否则会导致无限递归和栈溢出。
  • 内联函数
    • inline关键字修饰,建议函数体短小且调用频繁的函数使用,减少函数调用开销。
    • inline是编译器的建议而非强制,编译器可能拒绝内联较大的函数。
面向对象核心概念
  • 类与对象
    • 类是对数据和操作数据的方法的封装,相当于自定义类型;对象是类的实例,占用实际内存。
    • 成员变量:描述对象的属性,建议设为privateprotected,隐藏实现细节。
    • 成员函数:描述对象的行为,设为public作为对外接口,内部辅助函数设为private
  • 构造与析构函数
    • 构造函数:无返回值,与类同名,支持重载,用于初始化对象。默认构造函数在无自定义构造时自动生成。
    • 析构函数:无参数,与类同名加~,仅一个,用于清理对象资源。
    • 特殊构造:拷贝构造函数(const T&)用于对象拷贝,移动构造函数(T&&)用于转移临时对象资源,避免深拷贝。
  • 继承与多态
    • 继承方式:public继承保留基类成员的访问权限,protected继承将基类public成员变为protectedprivate继承将基类所有成员变为private
    • 多态:通过虚函数实现,基类指针或引用指向派生类对象时,调用派生类重写的虚函数。
    • 抽象类:包含纯虚函数(virtual void func() = 0),不能实例化,用于定义接口。
🗄️ STL容器与算法详解
常用容器特性
容器底层实现访问方式插入删除效率迭代器稳定性适用场景
vector动态数组随机访问尾部O(1),中间O(n)插入/删除导致迭代器失效频繁随机访问,尾部增删
list双向链表顺序访问任意位置O(1)迭代器稳定频繁插入删除操作
deque分段数组随机访问首尾O(1),中间O(n)插入/删除导致迭代器失效首尾频繁增删的队列
map红黑树键访问O(logn)迭代器稳定有序键值对存储,高效查找
unordered_map哈希表键访问O(1)平均插入可能导致迭代器失效无序键值对存储,快速查找
容器使用技巧
  • vector:提前用reserve预留内存,避免频繁扩容;批量删除元素用erase结合remove,减少元素移动次数。
  • stringfind方法查找子串,返回string::npos表示未找到;replace方法替换子串,可指定替换起始位置和长度;substr方法获取子串,参数为起始位置和长度。
  • map:用[]运算符访问键值对,若键不存在则插入默认值;用find方法查找键,返回迭代器,未找到则返回map::end()
🧠 内存管理与智能指针
内存分区与动态内存
  • 内存分区
    • 栈区:存储局部变量和函数参数,自动分配和释放,内存空间有限。
    • 堆区:动态分配内存(new/malloc),需手动释放(delete/free),否则会导致内存泄漏。
    • 全局/静态区:存储全局变量、静态变量和字符串常量,生命周期持续整个程序。
    • 代码段:存储函数体和类成员函数的机器指令,只读。
  • new/delete与malloc/free对比
    特性new/deletemalloc/free
    类型检查
    自动调用构造/析构
    返回值类型对应类型指针void*
    异常机制抛出bad_alloc异常返回NULL
智能指针详解
  • unique_ptr:独占所有权,同一时间只能有一个unique_ptr指向同一个对象,通过std::move转移所有权,不能直接拷贝。
  • shared_ptr:共享所有权,使用引用计数跟踪对象,当引用计数为0时自动释放内存,可通过use_count方法查看当前引用计数。
  • weak_ptr:解决shared_ptr的循环引用问题,不增加引用计数,可通过lock方法获取shared_ptr访问对象。
🚀 现代C++特性(C++11及以后)
列表初始化与auto
  • 列表初始化:统一的初始化语法,用{}进行初始化,避免窄化转换(如将浮点数转换为整数),语法更简洁。
  • auto类型推导:编译器自动推导变量类型,简化代码,尤其适用于复杂类型(如迭代器、Lambda表达式),但要注意auto不会推导引用和const属性,除非明确指定。
Lambda表达式与线程
  • Lambda表达式:定义匿名函数的语法,格式为[捕获列表](参数列表) -> 返回类型 { 函数体 }
    • 捕获方式:[]无捕获,[=]值捕获所有外部变量,[&]引用捕获所有外部变量,[x, &y]值捕获x,引用捕获y。
    • 适用场景:用于算法的自定义比较函数、异步任务的回调函数等。
  • 线程操作
    • std::thread创建线程,join方法等待线程执行完毕,detach方法让线程在后台执行。
    • std::mutex实现互斥锁,保护共享资源,避免数据竞争;std::lock_guard自动管理锁的生命周期,防止死锁。
http://www.cnnetsun.cn/news/2648648.html

相关文章:

  • 告别截图模糊:用Nvidia Ansel在UE4里捕获超清8K全景游戏画面的完整流程
  • EDEM中按outlet接触自动删颗粒并实时统计移除总质量
  • 二维雷达场景下机动目标EKF跟踪MATLAB实现(含轨迹对比与误差统计图)
  • 论文查重总踩坑?书匠策AI这个免费功能,我真后悔没早知道!
  • 别再硬扛内存了!手把手教你用Signac在服务器上搞定TF motif富集分析(附避坑指南)
  • RK3568多屏配置踩坑实录:为什么我的uboot启动失败了?
  • 别再硬编码了!用Shader Graph从零构建一个可交互的Unity URP水面(附完整节点图)
  • 告别WinForm:在麒麟V10SP1上,用Avalonia MVVM模式构建现代化C#桌面程序
  • Windows认证和安全对象的基本概念
  • 【避坑指南】架构设计中的十大常见错误
  • 别再手动解密了!.NET 6 集成微信支付V3回调,用Senparc SDK和OSS.PayCenter两种方式搞定Native支付通知
  • Claude整数规划求解能力深度测评(2024权威Benchmark实测报告):7类经典模型准确率、耗时、可行性全对比
  • Claude Opus 4.8 实测:更精确、更诚实,但创作还是不如 4.6
  • UE5 Lumen发光材质制作指南:从创建Emissive Material到无光环境调试
  • 从参数配置到可视化:手把手教你用D435i和VINS-Mono在ROS Noetic里建个地图
  • VSCode Copilot 如何配置第三方API/自定义端点?
  • 3大优势解析WenQuanYi Micro Hei:极简中文开源字体如何重塑嵌入式开发体验
  • 企业级AI Agent记忆系统架构:短期与长期记忆如何实现存储与调用?
  • UniApp + Painter 避坑指南:保存图片到相册的权限问题和清晰度优化实战
  • Linux 环境变量超详细入门到精通(零基础完整版)
  • Airy光束自由传播光强仿真:Matlab一键运行生成2D/3D分布图
  • 2026年企业聊天通讯工具选型指南:四大阵营与决策框架
  • 事件驱动架构:实现松耦合的系统设计
  • 现在不评估Claude代码质量,下季度将面临审计否决——金融级静态分析SOP限时解密
  • 2026年国际物流管理系统深度测评:技术架构、选型逻辑与行业实践
  • Linux 文件权限超详细详解(读懂权限标识、数字权限、特殊权限、chmod/chown)
  • 中电金信分布式核心系统与鲲鹏实现“原生开发”,共筑数智金融新范式
  • SSM架构JavaWeb点餐系统源码(含MySQL建库脚本与可运行工程)
  • 网络工程- 如何组件一个小型办公室网络
  • 如何选择电钢琴?立体声音效与型号对比