网络编程:问题与机制
核心要点速览 字节序:主机序(小端 / 大端)→ 网络序(大端),转换函数htons()/ntohs()、htonl()/ntohl() TCP 核心问题:粘包 / 半包(流式无边界),解决方案:固定长度、分隔符、消息头 + 消息体(最常用) UDP 特性:无粘包、可能丢包、数据报大小受限,读写用sendto()/recvfrom() 并发模型:多线程 / 多进程(简单低并发)、I/O 多路复用(epoll 核心,高并发)、线程池 / 进程池(平衡开销) 可靠性保障:超时(SO_RCVTIMEO)、心跳(应用层 / TCP keepalive)、重连(指数退避) 序列化:Protobuf/FlatBuffers(高性能)、JSON/XML(可读性)、自定义二进制(紧凑) 安全防护:SYN 洪水(SYN Cookie)、数据加密(SSL/TLS)、限流(防火墙 / 应用层) 一、字节序转换(跨平台通信基础) 主机字节序:CPU 存储数据的方式,分小端...
内存管理:RAII
核心要点速览 设计思想:资源获取与对象初始化绑定,资源释放与对象析构绑定(构造拿资源,析构放资源) 实现:封装资源为类成员,构造获取、析构释放,可选禁止拷贝 典型应用:智能指针、互斥锁、文件句柄、网络连接 优势:自动释放资源、异常安全、简化代码、保障资源独占 一、设计思想:资源对象的生命周期绑定RAII(Resource Acquisition Is Initialization)的本质是用对象生命周期管理资源: 对象构造时:自动获取资源(如分配内存、打开文件、加锁),确保资源获取成功后对象才有效; 对象析构时:自动释放资源(如释放内存、关闭文件、解锁),无论对象正常退出还是因异常销毁,析构函数都会执行。 二、实现原理 封装资源:定义类时,将待管理的资源(如指针、文件句柄、锁对象)声明为私有成员,禁止外部直接访问,确保资源只能通过类的接口管控; 强制获取资源:在构造函数中编写资源获取逻辑(如接收new的内存地址、调用fopen打开文件),若资源获取失败(如内存不足),直接抛出异常,避免构造 “无效对象”; 自动释放资源:在析构函数中编写资源释放逻辑(如delete内存、...
面向对象编程OOP:继承与多态
核心要点速览 继承:解决代码复用与扩展,核心是派生类获取基类成员;继承方式分 public/protected/private,构造先父后子、析构先子后父 多态:解决接口统一与动态行为,核心是基类指针 / 引用指向派生类对象,调用虚函数触发动态绑定 机制:虚函数(virtual)、纯虚函数(抽象类)、虚函数表(vtable)+ 虚指针(vptr)、虚析构(避免资源泄漏) 对比:重写(Override)vs 重载(Overload)vs 隐藏(Hide) 一、继承:代码复用与层次化设计继承是派生类从基类获取成员(属性 + 行为)的机制,核心是 “基于已有类扩展功能”。 1. 继承方式与成员访问权限继承方式决定基类成员在派生类中的访问权限,常用public继承(其他方式极少用)。 基类成员权限 public 继承(常用) protected 继承 private 继承 public 派生类 public 派生类 protected 派生类 private protected 派生类 protected 派生类 protected 派生...
内存管理:内存分区
核心要点速览 五大分区:栈(临时空间,自动管理)、堆(动态空间,手动管理)、全局 / 静态区(持久空间)、常量存储区(只读)、代码区(指令存储) 关键点:各分区存储内容 / 生命周期 / 分配方式、栈与堆的区别、const 变量存储位置、线程局部存储特性 补充:全局 / 局部 / 静态局部 / 静态全局变量的存储、生命周期及作用域差异 一、五大内存分区1. 栈(stack):函数调用的临时空间 存储内容:函数内局部变量(非 static)、函数参数、返回地址(调用后需返回的下一条指令地址)、寄存器上下文(函数调用时保存的 CPU 寄存器状态) 生命周期:随函数调用创建,函数执行结束后自动释放(无需手动干预) 特点: 分配效率:编译器通过移动栈顶指针(SP 寄存器)完成分配 / 释放,效率极高 内存特性:地址连续(栈帧结构),生长方向向下(从高地址向低地址扩展) 大小限制:默认固定(通常 1-8MB,可通过编译器 / 操作系统配置),超出则触发栈溢出 初始化:未初始化的局部变量值为 “垃圾值”(随机...
函数与指针:函数
核心要点速览 声明与定义:可多次声明,仅能一次定义;原型需匹配参数类型 / 个数(返回类型不影响) 参数传递:值传递(拷贝,不影响实参)、引用传递(别名,无拷贝)、指针传递(地址,支持 nullptr) 函数重载:同名 + 参数列表不同(类型 / 个数 / 顺序),返回类型不参与重载 内联函数:inline 修饰,建议编译器嵌入调用处(适合短函数,无循环 / 递归) 默认参数:遵循 “靠右原则”,不可跳过右侧参数省略左侧 返回值:禁止返回局部变量引用;大型对象返回有 RVO/NRVO 优化 一、函数的声明与定义概念 声明:告知编译器函数的 “存在及原型”(返回类型、函数名、参数类型 / 个数),不包含实现;参数名可选(仅声明时)。 用途:解决 “调用在前、定义在后” 的编译错误,如int add(int, int); 定义:包含声明 + 函数体(具体实现),编译器会分配内存生成指令。 规则 单定义原则(ODR):一个函数可在多个文件中声明,但仅能在一个文件中定义(否则链接报错 “重复定义”)。 原型匹配:声明与...
面向对象编程OOP:友元与运算符重载
核心要点速览 友元:打破封装,允许外部函数 / 类访问类的私有 / 保护成员(分友元函数、友元类、友元成员函数) 运算符重载:自定义类型的运算规则,不可重载 6 个运算符,支持成员函数 / 友元函数两种形式 特殊重载:赋值运算符=只能作为成员函数;<</>>需作为友元函数 一、友元:打破封装的特殊访问机制友元的核心是 “让外部实体获得类的特殊访问权限”,可访问私有(private)和保护(protected)成员,代价是削弱封装性。 1. 友元的种类(1)友元函数 声明方式:类内用friend声明,定义可在类外(非成员函数,无this指针)。 示例: 12345678910class A {private: int num = 10; // 友元函数声明 friend void printA(A& obj);};// 友元函数定义(类外),可直接访问私有成员void printA(A& obj) { cout << ob...
函数与指针:指针与引用
核心要点速览 指针:存储内存地址的变量,支持空值(nullptr)、动态指向、多级访问,存在野指针风险 引用:变量的别名,必须初始化、不可改指向、无空引用,语法简洁安全 访问效率:两者基本一致 适用场景:需空值 / 动态指向 / 多级访问用指针;需简洁语法 / 确保有效 / 避免误操作引用 一、指针指针本质是 “存储内存地址的变量”,支持对内存的间接访问。 1. 类型与特性(1)野指针 定义:未初始化、已释放或越界访问的指针(指向随机 / 无效内存)。 风险:访问野指针会导致内存错误(崩溃、数据错乱),是常见 bug 来源。 示例(错误): 12int* p; // 未初始化,野指针*p = 10; // 未定义行为(访问随机内存) 规避:指针定义时立即初始化(如int* p = nullptr;),释放后及时置空(p = nullptr;)。 (2)空指针(nullptr) 定义:C++11 标准的空指针常量,替代旧版NULL(NULL本质是0,易引发歧义)。 用途:表示指针 “无指向”,避免野指针,可通过条件判断安...
内存管理:动态内存
核心要点速览 动态内存:运行时手动分配,需手动释放(否则泄漏);new/delete 自动调用构造 / 析构,需与 new []/delete [] 严格匹配 智能指针(C++11+,<memory>):RAII 机制自动管理内存,unique_ptr(独占)、shared_ptr(共享,引用计数)、weak_ptr(解循环引用) 常见问题:内存泄漏(未释放)、野指针(未初始化)、悬空指针(指向已释放内存) 一、动态内存的分配与释放核心是 “分配 - 使用 - 释放” 闭环,C++ 推荐用 new/delete,需严格匹配使用。 1. C vs C++ 分配释放方式对比 对比维度 C(malloc/free) C++(new/delete) 类型安全 返回void*,需手动强转(不安全) 返回对应类型指针(无需转换,安全) 构造 / 析构 不调用(仅操作内存) 自动调用构造(new)/ 析构(delete) 数组支持 需手动计算总大小(n*sizeof(T)) 直接n...
异常处理:异常基础与语法
核心要点速览 异常处理三关键字:throw(抛出异常)、try(监控异常代码)、catch(捕获处理异常),核心是分离错误检测与处理 基本流程:try监控→throw抛异常→catch匹配处理;无匹配则异常传播,最终未捕获则程序终止 匹配规则:catch按声明顺序匹配,子类异常需在父类前捕获,catch(...)(万能捕获)必须放最后 异常类型:推荐类类型(标准库异常或自定义类),可携带详细信息;避免基本类型(语义模糊) 一、三个关键字一、throw(抛出异常) 作用:检测到不可处理的错误(如参数非法)时,主动抛出异常对象,中断当前执行,通知上层处理。 语法:throw 表达式;(表达式结果为异常对象)。 细节: 异常类型选择: 不推荐基本类型(如throw 1,语义模糊,无法区分错误类型); 推荐类类型(如标准库std::invalid_argument),可携带详细信息(如"文件路径不能为空")。 执行逻辑:throw后,当前函数中后续代码立即终止,进入异常传播阶段(寻找匹配catch)。 二、try(监控异常) 作用:包裹可能抛出异常的代码...
异常处理:标准库异常与自定义异常
核心要点速览 标准库异常:以std::exception为基类,分逻辑错误(编译可避免)和运行时错误(运行不可预知)两大类,核心接口what()返回错误描述 自定义异常:推荐继承std::exception,重写what()(必须加noexcept),语义需贴合业务场景 核心原则:优先复用标准库异常,自定义异常兼顾兼容性与信息完整性,杜绝基本类型异常,避免滥用 一、标准库异常体系(<stdexcept>)结构标准库提供了一套统一的异常类继承体系,所有标准异常均派生自std::exception抽象基类。这种设计保证了异常处理的兼容性 —— 无论捕获具体异常还是统一捕获基类引用,都能有效处理,是面试中 “规范异常使用” 的核心考点。 基类:std::exception 接口:virtual const char* what() const noexcept; 纯虚函数,返回 C 风格错误描述字符串,子类必须重写该方法才能实例化。 特性:无参构造、拷贝构造、拷贝赋值均被标记为noexcept,确保异常对象自身的构造和拷贝过程不会抛出新异常(避免双重异常)。 异常分类...

