C++教程 第15章 多态
第15章 多态多态的概念与原理多态是面向对象编程的核心特性之一,它允许使用统一的接口处理不同类型的对象,实现”一个接口,多种实现”的设计理念。 多态的核心原理 接口与实现分离:通过抽象接口定义行为,具体实现由派生类提供 运行时绑定:调用哪个具体实现由对象的实际类型决定,而非声明类型 代码复用:统一的接口使得代码可以处理不同类型的对象 扩展性:新的派生类可以无缝集成到现有系统中 多态的类型C++支持两种类型的多态: 编译时多态(静态多态):在编译阶段确定调用哪个函数 函数重载 运算符重载 模板 运行时多态(动态多态):在运行阶段确定调用哪个函数 虚函数 纯虚函数 抽象类 运行时多态的实现虚函数核心特性:虚函数是在基类中声明并在派生类中重写的成员函数,通过虚函数表(vtable)实现运行时多态。 123456789101112131415161718192021222324252627282930313233343536373839class Base {public: virtual void doSomething() { ...
C++教程 第17章 类的内存管理
第17章 类的内存管理动态内存分配概述动态内存分配是指在程序运行时根据需要分配和释放内存的过程。在C++中,使用new和delete运算符进行动态内存管理。 基本概念 静态内存:在编译时分配的内存,如全局变量、静态变量 栈内存:在函数调用时自动分配的内存,函数返回时自动释放 堆内存:在运行时动态分配的内存,需要手动释放 动态内存分配的优点 灵活性:可以根据运行时的需要分配内存 持久性:堆内存的生命周期由程序员控制,不受函数作用域的限制 大数据结构:可以分配大型数据结构,如大型数组、复杂对象等 new 和 delete 运算符分配单个对象123456789101112131415161718192021222324252627282930313233343536// 分配单个intint* pInt = new int;*pInt = 100;std::cout << *pInt << std::endl;delete pInt;pInt = nullptr;// 分配并初始化int* pInt2 = new int(200);std::cout <...
C++教程 第19章 模板和泛型编程
第19章 模板和泛型编程代码重用的概念代码重用是指在不同的程序或项目中使用已有的代码,而不是重新编写相同的功能。C++提供了多种代码重用的机制,包括函数重载、模板、继承、组合等。 继承与组合继承继承是一种”is-a”关系,派生类是基类的一种特殊类型。 12345678910111213141516171819202122232425// 继承示例class Animal {protected: std::string name;public: Animal(const std::string& n) : name(n) {} void eat() { std::cout << name << " is eating." << std::endl; } virtual void makeSound() { std::cout << name << " makes a s...
C++教程 第18章 类的高级特性
第18章 类的高级特性友元友元函数友元函数是指可以访问类的私有成员和保护成员的非成员函数。 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);};// 定义友元函数double calculateVolume(const Box& box) { return box.wi...
C++教程 第21章 运算符重载
第21章 运算符重载运算符重载的基本概念运算符重载是C++的一项强大特性,允许程序员为自定义类型定义运算符的行为。通过运算符重载,可以使自定义类型的使用更加直观和自然。 什么是运算符重载?运算符重载是指重新定义运算符的行为,使其能够应用于自定义类型。例如,我们可以为一个Complex(复数)类重载+运算符,使其能够直接进行复数加法运算。 运算符重载的语法运算符重载的语法与函数定义类似,只是函数名由operator关键字和要重载的运算符组成: 123返回类型 operator运算符(参数列表) { // 实现运算符的行为} 可重载的运算符C++中大部分运算符都可以重载,但有一些例外。以下是可重载和不可重载的运算符: 可重载的运算符 算术运算符:+, -, *, /, %, ++, -- 关系运算符:==, !=, <, >, <=, >= 逻辑运算符:&&, ||, ! 位运算符:&, |, ^, ~, <<, >> 赋值运算符:=, +=, -=, *=, /=, %=, &...
C++教程 第20章 高级模板编程
第20章 高级模板编程模板的基本概念模板是C++中实现泛型编程的核心机制,它允许我们编写与类型无关的代码,提高代码的重用性和灵活性。 什么是模板?模板是一种参数化的代码蓝图,它可以根据不同的类型参数生成具体的代码。C++中的模板分为两种: 函数模板:生成不同类型的函数 类模板:生成不同类型的类 模板的优势 代码重用:编写一次代码,适用于多种类型 类型安全:在编译时进行类型检查 性能优化:编译器可以为特定类型生成优化的代码 灵活性:可以处理各种类型,包括自定义类型 函数模板函数模板是一种通用的函数定义,它可以操作不同类型的参数。 基本语法1234 template <typename T>T functionName(T parameters) { // 函数体} 其中,typename关键字可以替换为class,它们的含义相同。 示例:最大值函数1234567891011121314151617181920212223#include <iostream>// 函数模板:求两个值的最大值template<typena...
C++教程 第22章 函数对象与Lambda表达式
第22章 函数对象与Lambda表达式函数指针函数指针的概念函数指针是指向函数的指针,它可以存储函数的地址,并通过该地址调用函数。 函数指针的声明与使用12345678910111213// 声明函数指针int (*addPtr)(int, int);// 定义函数int add(int a, int b) { return a + b;}// 赋值addPtr = add;// 调用int result = addPtr(1, 2); // 结果为3 函数指针作为参数12345678910111213141516171819void process(int a, int b, int (*operation)(int, int)) { int result = operation(a, b); std::cout << "Result: " << result << std::endl;}int add(int a, int b) { return...
C++教程 第23章 异常处理
第23章 异常处理异常处理的基本概念异常是程序执行过程中发生的错误或特殊情况,例如除以零、数组越界、内存分配失败等。C++的异常处理机制允许我们捕获和处理这些异常,使程序能够更加健壮和可靠。 异常处理的三个关键字 try:定义可能抛出异常的代码块 catch:捕获并处理异常 throw:抛出异常 异常处理的基本语法123456789101112131415161718192021#include <iostream>#include <string>int divide(int numerator, int denominator) { if (denominator == 0) { throw std::string("Division by zero"); } return numerator / denominator;}int main() { try { int result = divide(10, 0); ...
C++教程 第25章 并发与异步模式
第25章 并发与异步模式并发编程概述并发编程是指同时执行多个任务的编程方式,它可以提高程序的性能和响应速度。在现代计算机系统中,多核处理器已经非常普遍,并发编程可以充分利用多核资源,提高程序的执行效率。 并发的类型 多进程并发:使用多个进程来执行任务,进程之间通过进程间通信(IPC)机制进行通信 多线程并发:在同一个进程中使用多个线程来执行任务,线程之间共享进程的内存空间 异步编程:使用回调、Promise、Future等机制,在单线程中实现并发效果 并发的挑战 竞态条件:多个线程同时访问和修改共享数据,导致结果不确定 死锁:多个线程互相等待对方释放资源,导致所有线程都无法继续执行 活锁:多个线程不断改变自己的状态以响应其他线程的变化,但没有任何线程能够继续执行 饥饿:一个线程一直无法获得所需的资源,导致无法继续执行 线程安全:确保多个线程访问共享数据时不会导致数据不一致或其他问题 多线程编程线程的创建和管理C++11引入了标准线程库std::thread,使得创建和管理线程变得更加简单和便携。 创建线程12345678910111213141516171819#includ...
C++教程 第24章 高级异常处理
第24章 高级异常处理异常安全保证异常安全是指当异常发生时,程序能够保持一致的状态,不会泄漏资源,也不会破坏数据结构。C++中,异常安全保证通常分为三个级别: 1. 基本异常安全(Basic Exception Safety) 保证:当异常发生时,程序不会泄漏资源,数据结构保持有效状态,但可能不是原始状态 示例:使用智能指针管理内存,确保即使发生异常也能释放内存 1234567891011121314#include <memory>#include <vector>void processData(std::vector<int>& data) { std::vector<int> temp; // 复制数据到临时向量 for (int value : data) { temp.push_back(value * 2); } // 如果上面的操作抛出异常,data不会被修改 data.swap(temp); // 无异常操作&...



