数组与字符串:字符串
核心要点速览 C 风格字符串:以'\0'结尾的字符数组,依赖cstring库函数,无安全检查(易溢出) C++ std::string:动态管理、安全便捷,支持 SSO(小字符串优化),提供丰富成员方法 拷贝关键:C 语言strcpy不安全、strncpy需补'\0'、strlcpy安全非标准;C++ 直接用拷贝构造 / 赋值 /assign 一、C 风格字符串(char[])本质是以'\0'(空字符)为结束标记的字符数组,'\0'是字符串终止的核心标识。 1. 初始化(易错)1234567// 正确写法char str1[] = "hello"; // 自动添加'\0',数组长度6(h e l l o \0)char str2[] = {'h','i','\0'}; // 手动添加'\0',长度3char str3[10] = "hi&qu...
数组与字符串:数组
核心要点速览 数组名:本质是首元素地址,仅 3 种场景不退化(sizeof、&数组名、decltype) 数组传参:一维退化为指针(丢失长度),二维必须指定第二维长度 C 风格字符串:以'\0'结尾的字符数组,strlen与sizeof计算逻辑不同 数组 vs vector:数组编译期定长、手动管理;vector 动态扩容、自动管理 一、数组名与指针1. 特性数组名 通常等价于首元素地址,仅 3 种场景保留数组类型特性(不退化)。 2. 数组名不退化的 3 种场景 sizeof(数组名):计算整个数组的字节总大小(非指针大小) &数组名:获取指向 “整个数组” 的指针(类型为数组类型(*)[长度]) decltype(数组名):推导为数组类型(如decltype(arr)为int[5]) 3. 数组初始化(C++11+) 聚合初始化简化:可省略等号,多维数组支持部分初始化 12int arr[] {1,2,3}; // 等价于 int arr[] = {1,2,3}int mat[2...
网络编程:问题与机制
核心要点速览 字节序:主机序(小端 / 大端)→ 网络序(大端),转换函数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 存储数据的方式,分小端...
函数与指针:函数
核心要点速览 声明与定义:可多次声明,仅能一次定义;原型需匹配参数类型 / 个数(返回类型不影响) 参数传递:值传递(拷贝,不影响实参)、引用传递(别名,无拷贝)、指针传递(地址,支持 nullptr) 函数重载:同名 + 参数列表不同(类型 / 个数 / 顺序),返回类型不参与重载 内联函数:inline 修饰,建议编译器嵌入调用处(适合短函数,无循环 / 递归) 默认参数:遵循 “靠右原则”,不可跳过右侧参数省略左侧 返回值:禁止返回局部变量引用;大型对象返回有 RVO/NRVO 优化 一、函数的声明与定义概念 声明:告知编译器函数的 “存在及原型”(返回类型、函数名、参数类型 / 个数),不包含实现;参数名可选(仅声明时)。 用途:解决 “调用在前、定义在后” 的编译错误,如int add(int, int); 定义:包含声明 + 函数体(具体实现),编译器会分配内存生成指令。 规则 单定义原则(ODR):一个函数可在多个文件中声明,但仅能在一个文件中定义(否则链接报错 “重复定义”)。 原型匹配:声明与...
函数与指针:指针与引用
核心要点速览 指针:存储内存地址的变量,支持空值(nullptr)、动态指向、多级访问,存在野指针风险 引用:变量的别名,必须初始化、不可改指向、无空引用,语法简洁安全 访问效率:两者基本一致 适用场景:需空值 / 动态指向 / 多级访问用指针;需简洁语法 / 确保有效 / 避免误操作引用 一、指针指针本质是 “存储内存地址的变量”,支持对内存的间接访问。 1. 类型与特性(1)野指针 定义:未初始化、已释放或越界访问的指针(指向随机 / 无效内存)。 风险:访问野指针会导致内存错误(崩溃、数据错乱),是常见 bug 来源。 示例(错误): 12int* p; // 未初始化,野指针*p = 10; // 未定义行为(访问随机内存) 规避:指针定义时立即初始化(如int* p = nullptr;),释放后及时置空(p = nullptr;)。 (2)空指针(nullptr) 定义:C++11 标准的空指针常量,替代旧版NULL(NULL本质是0,易引发歧义)。 用途:表示指针 “无指向”,避免野指针,可通过条件判断安...
模板与STL:STL
核心要点速览 组件:容器(存储)、算法(操作)、迭代器(桥梁)、仿函数(自定义逻辑)、适配器(接口转换)、分配器(内存管理) 容器分类:序列式(vector/list/deque)、关联式(有序红黑树 / 无序哈希表)、适配器(stack/queue/priority_queue) 关键:底层实现、迭代器失效、容器选型、算法适用条件、内存与效率权衡 一、STL 组件 容器:类模板,封装数据结构(如 vector/map),存储数据的载体。 算法:函数模板,提供通用操作(sort/find),通过迭代器操作容器。 迭代器:类似指针的对象,提供元素访问接口,是容器与算法的桥梁。 仿函数:重载operator()的类 / 结构体(函数对象),传递自定义逻辑(比较 / 筛选)。 适配器:转换已有组件接口(含容器适配器、迭代器适配器如 reverse_iterator、函数适配器如 bind),如 stack 基于 deque 适配。 分配器:默认std::allocator,核心接口含alloc...
面向对象编程OOP:类与对象
核心要点速览 访问控制:public(接口)、private(实现)、protected(继承) const 成员:const 成员变量需初始化列表初始化;const 成员函数不可修改成员变量 static 成员:静态成员变量类共享、类外初始化;静态成员函数无 this 指针、仅访问静态成员 构造函数:可重载、非虚函数;含默认 / 带参 / 拷贝 / 移动构造 析构函数:不可重载;基类需设为虚函数避免资源泄漏 类大小:仅取决于非静态数据成员,遵循内存对齐 一、基本概念 类:抽象的数据类型模板,定义对象的属性(数据成员)和行为(成员函数)。 对象:类的具体实例,占用实际内存,拥有类定义的属性和行为。 二、核心特性:封装核心是 “隐藏实现细节,暴露公共接口”,通过访问控制符实现。 访问控制符 可访问范围 作用 public 类内、类外、派生类 暴露接口,供外部调用 private 仅类内和友元 隐藏数据成员和内部实现 protected 类内、友元、派生类(类外不可访问) 为继承预留访问权限 封装意义:保障数据安全、提升...
模板与STL:模板基础
核心要点速览 意义:将类型作为参数,实现通用逻辑,编译期生成具体类型代码 分类:函数模板(可隐式实例化)、类模板(需显式实例化) 模板参数:类型参数(typename T)、非类型参数(编译期常量) 特化:全特化(所有参数指定类型)、偏特化(仅类模板支持,部分参数指定类型) 区别:模板有类型检查,宏无;模板支持特化 / 重载,宏不支持 一、模板的意义通过 “类型参数化” 让通用逻辑适配多种类型,既避免为不同类型重复编写相似代码(提升复用),又能在编译期进行类型检查(保证安全),且编译器会生成具体类型的代码(无运行时开销)。这也是 STL 容器(如 vector)和算法(如 sort)的实现基础。 二、函数模板定义生成具体函数的 “模板”,编译器根据实参类型自动实例化对应版本。 规则 语法:template<模板参数列表> 返回类型 函数名(参数列表) { ... } 实例化: 隐式实例化:编译器根据实参推导类型(如max(1,2)推导T=int)。 显式实例化:手动指定类型(如max<int>(1.5,2.5)强制T=int)。 重载:...
面向对象编程OOP:继承与多态
核心要点速览 继承:解决代码复用与扩展,核心是派生类获取基类成员;继承方式分 public/protected/private,构造先父后子、析构先子后父 多态:解决接口统一与动态行为,核心是基类指针 / 引用指向派生类对象,调用虚函数触发动态绑定 机制:虚函数(virtual)、纯虚函数(抽象类)、虚函数表(vtable)+ 虚指针(vptr)、虚析构(避免资源泄漏) 对比:重写(Override)vs 重载(Overload)vs 隐藏(Hide) 一、继承:代码复用与层次化设计继承是派生类从基类获取成员(属性 + 行为)的机制,核心是 “基于已有类扩展功能”。 1. 继承方式与成员访问权限继承方式决定基类成员在派生类中的访问权限,常用public继承(其他方式极少用)。 基类成员权限 public 继承(常用) protected 继承 private 继承 public 派生类 public 派生类 protected 派生类 private protected 派生类 protected 派生类 protected 派生...
面向对象编程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...
