C++教程 第18章 类的高级特性
第18章 类的高级特性友元友元是C++中一种特殊的访问控制机制,它允许特定的函数或类访问另一个类的私有成员和保护成员。虽然友元会破坏封装性,但在某些场景下,它可以提高代码的灵活性和性能。 友元函数友元函数是指可以访问类的私有成员和保护成员的非成员函数。 123456789101112131415161718192021222324252627282930313233#include <iostream>class Box {private:double width;double height;double depth; public:Box(double w, double h, double d) : width(w), height(h), depth(d) {} // 声明友元函数 friend double calculateVolume(const Box& box); friend void displayBox(const Box& box);};// 定义友元函数d...
C++教程 第19章 模板和泛型编程
第19章 模板和泛型编程模板的底层实现原理模板实例化机制模板是C++中实现泛型编程的核心机制,其底层实现涉及编译期实例化过程: 模板定义:编译器解析模板代码,但不生成具体代码 实例化触发:当模板被使用时(如创建对象或调用函数) 类型替换:编译器将模板参数替换为具体类型 代码生成:为每个唯一的模板实例生成专门的代码 优化:对生成的代码应用常规编译优化 模板实例化的编译器处理12345678910111213141516171819// 模板定义template <typename T>T maximum(T a, T b) { return a > b ? a : b;}// 实例化触发int main() { int a = 1, b = 2; double c = 1.5, d = 2.5; // 触发 int 版本的实例化 int max_int = maximum(a, b); // 触发 double 版本的实例化 double max_double = maxi...
C++教程 第21章 函数对象与Lambda表达式
第21章 函数对象与Lambda表达式函数对象的深度解析函数对象(Function Object),也称为仿函数(Functor),是C++中一种特殊的对象,它可以像函数一样被调用。函数对象通过重载operator()运算符实现,使其能够具有函数的行为,同时又可以拥有状态。 函数对象的基本概念函数对象是一个重载了函数调用运算符()的类的实例。当我们创建这个类的对象后,就可以像调用函数一样使用它。 12345678910111213141516class Add {private: int value;public: Add(int v) : value(v) {} // 函数调用运算符重载 int operator()(int x) const { return x + value; }};// 使用函数对象Add add5(5);int result = add5(10); // 调用operator(),返回15 函数对象的优势相比普通函数,函数对象具有以下优势:...
C++教程 第24章 文件I/O操作
第24章 文件I/O操作文件I/O基础1. 标准文件流C++标准库提供了三种基本的文件流类: std::ifstream:用于读取文件 std::ofstream:用于写入文件 std::fstream:用于读写文件 这些类都继承自相应的标准流类(std::istream、std::ostream、std::iostream),因此支持相同的输入输出操作。 1234567891011121314151617181920212223242526272829303132333435363738394041#include <fstream>#include <iostream>#include <string>int main() { // 写入文件 std::ofstream outFile("example.txt"); if (outFile.is_open()) { outFile << "Hello, File I/O!&...
C++教程 第25章 异常处理基础
第25章 异常处理基础异常处理概述异常处理是一种处理程序运行时错误的机制,它允许程序在遇到错误时,跳转到专门的错误处理代码,而不是直接崩溃。C++的异常处理机制提供了一种结构化的方式来处理错误,使得错误处理代码与正常业务逻辑分离,提高了代码的可读性和可维护性。 异常处理的基本概念 异常:程序运行时发生的错误情况,如除零、数组越界、内存不足等 抛出异常:当程序遇到错误时,使用throw关键字抛出异常 捕获异常:使用try-catch块捕获并处理异常 异常传播:如果异常在当前函数中没有被捕获,它会沿着调用栈向上传播,直到被捕获或导致程序终止 异常处理的优势 错误处理与业务逻辑分离:异常处理代码集中在catch块中,使正常业务逻辑更加清晰 分层错误处理:不同层次的代码可以处理不同类型的异常 资源自动释放:结合RAII(资源获取即初始化),确保即使发生异常也能正确释放资源 错误信息传递:异常对象可以携带详细的错误信息 强制错误处理:某些异常必须被处理,否则会导致程序终止 异常的基本语法抛出异常使用throw关键字抛出异常: 123456789101112131415161718#in...
C++教程 第26章 高级异常处理
第26章 高级异常处理高级异常层次结构设计异常层次结构的设计原则设计一个良好的异常层次结构是大型系统中异常处理的基础,它应该遵循以下原则: 单一职责原则:每个异常类应该只表示一种特定类型的错误 层次清晰:异常类应该按照错误的严重程度和类型进行层次化组织 信息丰富:异常类应该包含足够的信息,以便于调试和错误处理 可扩展性:异常层次结构应该易于扩展,以适应系统的演化 标准异常层次结构分析C++标准库提供了一个异常层次结构,从std::exception基类派生: std::exception - 所有标准异常的基类 std::bad_alloc - 内存分配失败 std::bad_cast - 类型转换失败 std::bad_typeid - typeid操作失败 std::bad_exception - 异常处理中的异常 std::logic_error - 逻辑错误(可在编译时检测) std::domain_error - 定义域错误 std::invalid_argument - 无效参数 std::length_error - 长度错误 std::out_of_rang...
C++教程 第27章 本地化与正则表达式
第27章 本地化与正则表达式本地化(国际化)基础本地化的重要性本地化(Localization,简称L10n)和国际化(Internationalization,简称I18n)是现代软件 development中的重要概念: 国际化:设计和开发软件,使其能够轻松适应不同的语言和地区 本地化:将国际化的软件适配到特定的语言和地区 在C++中,本地化主要通过<locale>头文件中的设施实现。 字符编码基础常见字符编码 编码 描述 特点 ASCII 美国信息交换标准代码 7位编码,仅支持英文字符 ISO-8859-1 Latin-1 8位编码,支持西欧语言 UTF-8 Unicode转换格式-8 可变长度编码,支持所有Unicode字符 UTF-16 Unicode转换格式-16 2或4字节编码,支持所有Unicode字符 UTF-32 Unicode转换格式-32 4字节编码,支持所有Unicode字符 C++中的字符类型12345678910111213141516171819202122// 基本字符类型char c1 = ...
C++教程 第31章 可重用代码
第31章 可重用代码代码重用的设计原则1. 单一职责原则核心概念:一个模块或类应该只负责一项功能,避免职责混合导致的耦合和维护困难。 实践指南: 每个类或函数应该有明确的责任边界 当一个类的职责开始膨胀时,考虑拆分为多个专注的类 使用接口分离原则(ISP)确保客户端只依赖于它们实际使用的接口 示例: 12345678910111213141516171819202122232425// 不好的设计:一个类负责多个不相关的功能class UserManager {public: void createUser(const std::string& name); void deleteUser(int userId); void sendEmail(const std::string& email, const std::string& message); // 不属于用户管理的核心职责 void generateReport(); // 不属于用户管理的核心职责};// 好的设计:职责分离class UserM...
C++教程 第32章 设计可重用代码
第32章 设计可重用代码可重用代码概述可重用代码是指可以在多个项目中重复使用的代码,它具有以下特点: 通用性:能够适用于不同的场景 可扩展性:易于添加新功能 可维护性:易于理解和修改 可靠性:经过充分测试,稳定可靠 文档完善:有清晰的文档说明 模块化设计模块的概念模块是一个独立的、可重用的代码单元,它具有明确的接口和实现。在C++中,模块可以通过命名空间、类、函数库等方式实现。 模块化的好处 代码组织:将代码组织成逻辑模块,提高代码的可读性和可维护性 代码重用:模块可以在多个项目中重复使用 并行开发:不同的团队可以并行开发不同的模块 隔离变化:一个模块的变化不会影响其他模块 模块设计原则 高内聚:模块内部的元素之间应该高度相关 低耦合:模块之间的依赖应该尽可能少 接口与实现分离:模块的接口应该与实现分离 单一职责:每个模块应该只有一个职责 接口设计接口的概念接口是模块与外部世界交互的桥梁,它定义了模块提供的功能和如何使用这些功能。在C++中,接口可以通过抽象类、纯虚函数、头文件等方式实现。 接口设计原则 简洁明了:接口应该简洁明了,只暴露必要的功能 稳定可靠:接口一旦发布...
C++教程 第33章 工程化与模块化
第33章 工程化与模块化工程化概述工程化是指将软件开发视为一项工程,通过规范化、标准化的流程和工具,提高软件质量和开发效率的过程。C++项目的工程化涉及项目结构、构建系统、版本控制、代码规范等多个方面。 工程化的重要性 提高代码质量:通过规范化的流程和工具,减少错误和缺陷 提高开发效率:自动化构建、测试和部署,减少重复工作 便于团队协作:统一的代码规范和项目结构,便于团队成员之间的沟通和协作 便于维护和扩展:模块化的设计和清晰的代码结构,便于后续的维护和扩展 项目结构典型的C++项目结构一个良好的C++项目结构应该清晰、模块化,便于管理和维护。以下是一个典型的C++项目结构: 12345678910111213141516project/├── CMakeLists.txt # CMake构建配置文件├── include/ # 头文件目录│ └── project/ # 项目命名空间目录│ ├── module1/ # 模块1的头文件│ └── module2/ # 模块2的头文件...



