c++ 接口/多态
目录
接口的通用定义
特点:
C++ 中的接口
接口的作用
接口与抽象类的区别
什么是多态?
多态的类型
1. 编译时多态
2. 运行时多态
多态的实现原理
注意事项
在编程中,接口(Interface) 是一个抽象概念,用于定义一组行为规范或功能约定,而不提供具体实现。它是一种契约,规定了实现它的类必须提供哪些方法或功能。接口广泛用于面向对象编程(OOP)中,以实现模块化、解耦和多态。
下面我会从通用概念和 C++ 的角度详细解释“接口”。
接口的通用定义
接口可以看作是类与类之间通信的桥梁。它只声明方法(或函数)的签名(如名称、参数、返回值类型),而不关心这些方法如何实现。实现接口的类必须按照接口的定义提供具体实现。
特点:
-
抽象性:接口本身不包含实现细节。
-
强制性:实现接口的类必须实现所有接口中定义的方法。
-
多态性:通过接口类型引用具体实现,可以在运行时动态调用不同类的行为。
比喻:接口就像一份合同,规定了“做什么”(what),但不关心“怎么做”(how)。比如,一个“电源插座”接口定义了“提供220V交流电”的规范,具体是水力发电还是太阳能发电由实现者决定。
C++ 中的接口
C++ 没有像 Java 或 C# 那样的显式 interface 关键字,但通过纯虚函数和抽象类,可以实现接口的功能。具体来说:
-
一个类中所有函数都是纯虚函数(virtual ... = 0)的抽象类,通常被用作接口。
-
派生类继承这个抽象类并实现所有纯虚函数。
示例:C++ 中的接口
#include <iostream>
using namespace std;// 接口(抽象基类)
class Printable {
public:virtual void print() const = 0; // 纯虚函数virtual ~Printable() {} // 虚析构函数,确保正确清理
};// 实现接口的类
class Book : public Printable {
private:string title;
public:Book(const string& t) : title(t) {}void print() const override {cout << "Book: " << title << endl;}
};class Article : public Printable {
private:string author;
public:Article(const string& a) : author(a) {}void print() const override {cout << "Article by: " << author << endl;}
};int main() {Printable* items[2];items[0] = new Book("C++ Primer");items[1] = new Article("John Doe");for (int i = 0; i < 2; i++) {items[i]->print(); // 多态调用delete items[i];}return 0;
}
输出:
Book: C++ Primer
Article by: John Doe
在这个例子中:
-
Printable 是一个接口,定义了 print 方法。
-
Book 和 Article 是具体类,实现了 Printable 接口。
-
通过 Printable* 指针,可以统一调用不同类的 print 方法,实现多态。
接口的作用
-
解耦合:
调用方只依赖接口,不依赖具体实现。例如,main 函数不需要知道 Book 或 Article 的细节,只需知道它们实现了 Printable。
-
可扩展性:
新增一个实现类(如 Magazine)时,无需修改现有代码,只要它实现 Printable 接口即可。
-
多态性:
通过基类指针或引用调用派生类的实现,动态绑定到正确的函数。
-
规范化:
强制所有实现类提供一致的行为(如 print 方法)。
接口与抽象类的区别
在 C++ 中,接口和抽象类都依赖纯虚函数,但它们有细微区别:
-
接口:通常只包含纯虚函数,纯粹定义行为规范,没有数据成员或实现。
-
抽象类:可以包含纯虚函数、普通虚函数甚至具体实现,可能还有数据成员,用于提供部分默认行为。
示例(抽象类 vs 接口):
// 接口
class ILog {
public:virtual void log(const string& message) = 0;virtual ~ILog() {}
};// 抽象类
class Logger {
protected:string prefix;
public:Logger(const string& p) : prefix(p) {}virtual void log(const string& message) = 0; // 纯虚函数void info(const string& msg) { // 提供默认实现log(prefix + " INFO: " + msg);}
};
什么是多态?
多态,字面意思是“多种形态”,在编程中指的是同一个接口或方法可以在不同的对象上表现出不同的行为。换句话说,多态允许用统一的接口调用不同类的实现,而具体执行哪个实现取决于对象的实际类型。
通俗解释:多态就像一个遥控器,按下“播放”按钮,不同设备(电视、音响、DVD播放器)会有不同的反应,但你只需要知道“按播放”就行,不用管背后是哪种设备。
多态的类型
在 C++ 中,多态主要分为两种:
-
编译时多态(Compile-time Polymorphism)
-
通过**函数重载(Function Overloading)和运算符重载(Operator Overloading)**实现。
-
在编译时就确定调用哪个函数。
-
-
运行时多态(Run-time Polymorphism)
-
通过**虚函数(Virtual Function)**和继承实现。
-
在运行时根据对象的实际类型动态决定调用哪个函数。
-
1. 编译时多态
编译时多态是静态的,依赖函数名相同但参数不同的重载机制。
示例:函数重载
#include <iostream>
using namespace std;class Calculator {
public:int add(int a, int b) {return a + b;}double add(double a, double b) {return a + b;}
};int main() {Calculator calc;cout << calc.add(2, 3) << endl; // 调用 int 版本,输出 5cout << calc.add(2.5, 3.7) << endl; // 调用 double 版本,输出 6.2return 0;
}
这里 add 函数根据参数类型在编译时选择合适的版本。
示例:运算符重载
class Complex {
private:double real, imag;
public:Complex(double r, double i) : real(r), imag(i) {}Complex operator+(const Complex& other) {return Complex(real + other.real, imag + other.imag);}void print() {cout << real << " + " << imag << "i" << endl;}
};int main() {Complex a(1.0, 2.0), b(3.0, 4.0);Complex c = a + b; // 重载了 + 运算符c.print(); // 输出 4 + 6ireturn 0;
}
+ 运算符被重载,编译器根据上下文选择实现。
2. 运行时多态
运行时多态是动态的,依赖继承和虚函数机制。通过基类指针或引用调用派生类的函数,具体调用哪个版本在运行时决定。
示例:虚函数实现多态
#include <iostream>
using namespace std;class Animal {
public:virtual void sound() { // 虚函数cout << "Some generic animal sound" << endl;}virtual ~Animal() {} // 虚析构函数
};class Dog : public Animal {
public:void sound() override {cout << "Woof" << endl;}
};class Cat : public Animal {
public:void sound() override {cout << "Meow" << endl;}
};int main() {Animal* animals[2];animals[0] = new Dog();animals[1] = new Cat();for (int i = 0; i < 2; i++) {animals[i]->sound(); // 运行时根据对象类型调用delete animals[i];}return 0;
}
输出:
Woof
Meow
-
Animal* 指针指向 Dog 或 Cat 对象,调用 sound() 时根据实际对象类型执行对应版本。
-
这是运行时多态的核心,依赖虚函数表(vtable)实现。
没有虚函数的对比
如果去掉 virtual:
class Animal {
public:void sound() {cout << "Some generic animal sound" << endl;}
};class Dog : public Animal {
public:void sound() {cout << "Woof" << endl;}
};int main() {Animal* ptr = new Dog();ptr->sound(); // 输出 "Some generic animal sound"delete ptr;return 0;
}
没有 virtual,调用的是 Animal 的版本,因为指针类型是 Animal*,这就是静态绑定。
多态的实现原理
运行时多态依赖虚函数表(vtable):
-
每个包含虚函数的类有一个虚函数表,存储虚函数的地址。
-
每个对象包含一个指向其类虚函数表的指针(vptr)。
-
调用虚函数时,通过 vptr 查找表中的函数地址,动态调用。
过程:
-
编译器在类中插入 vptr。
-
对象创建时,vptr 被初始化为指向对应类的 vtable。
-
调用虚函数时,程序通过 vptr 找到并执行正确的函数。
注意事项
-
性能开销:运行时多态通过 vtable 实现,有少量内存和间接调用的开销。
-
虚函数要求:必须通过指针或引用调用,对象直接调用仍是静态绑定。
-
虚析构函数:基类应有虚析构函数,避免删除派生类对象时资源泄漏。
相关文章:
c++ 接口/多态
目录 接口的通用定义 特点: C 中的接口 接口的作用 接口与抽象类的区别 什么是多态? 多态的类型 1. 编译时多态 2. 运行时多态 多态的实现原理 注意事项 在编程中,接口(Interface) 是一个抽象概念ÿ…...
【大模型学习】第十二章 大模型获取智能机制
目录 引言 1. 模型架构 Transformer架构 层次结构和层数 2. 训练数据 3. 大规模训练 4. 迁移学习与微调 4.1 微调步骤 5. 机制实例 自注意力机制 多头注意力机制 总结 引言 随着深度学习的发展,特别是大型预训练模型(大模型)的出…...
神经网络|(十四)|霍普菲尔德神经网络-Hebbian训练
【1】引言 前序学习进程中,除了对基本的神经网络知识进行了学习,还掌握了SOM神经网络原理,文章链接包括且不限于: 神经网络|(十一)|神经元和神经网络-CSDN博客 神经网络|(十二)|常见激活函数-CSDN博客 神经网络|(十三)|SOM神经…...
华为鸿蒙系统全景解读:从内核设计到生态落地的技术革命
华为鸿蒙系统全景解读:从内核设计到生态落地的技术革命 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc 文章目录 华为鸿蒙系统全景解读&#x…...
基于大数据的Steam游戏数据分析可视化推荐系统
【大数据】🎮 项目名:游戏分析神器,用代码探析游戏世界——《基于大数据的Steam游戏分析与智能推荐系统》(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 &a…...
将长上下文大语言模型研究从输入转向输出
将长上下文大语言模型研究从输入转向输出 摘要: 近年来,长上下文大语言模型(LLMs)的研发主要集中在处理更长的输入文本上,这使得模型在理解长篇内容时取得了显著进步。然而,生成长篇输出的研究却相对被忽视ÿ…...
Dify 开源大语言模型应用开发平台使用(二)
文章目录 说明Dify 使用报告1. 应用创建——专业的锂电池相关知识解答1.1 平台简介1.2 创建应用2. 知识库、工作流、变量、节点与编排节点详解2.1 知识库管理2.2 工作流配置2.3 变量管理2.4 节点与编排节点3. 测试和调试3.1 单元测试3.2 日志与监控3.3 实时调试3.4 性能测试总结…...
CarPlanner:用于自动驾驶大规模强化学习的一致性自回归轨迹规划
25年2月来自浙大和菜鸟网络的论文“CarPlanner: Consistent Auto-regressive Trajectory Planning for Large-scale Reinforcement Learning in Autonomous Driving”。 轨迹规划对于自动驾驶至关重要,可确保在复杂环境中安全高效地导航。虽然最近基于学习的方法&a…...
K8s面试题总结(十一)
1.如何优化docker镜像的大小? 使用多阶段构建(multi-stage build)选择更小的基础镜像(如alpine)减少镜像层数,合并RUN命令 2.请解释Docker中的网络模式(如bridge,host,none) Bridgeÿ…...
Android Telephony 四大服务和数据网络控制面数据面介绍
在移动通信和Android系统中,涉及的关键概念和服务以及场景案例说明如下: 一、概念 (一)Android Telephony 的四大服务 介绍Telephony Data 与 Android Data 的四大服务在Android系统中,与电话(Telephony)和移动数据(Data)相关的核心服务主要包括以下四类: 1. Tele…...
一文讲懂Go语言如何使用配置文件连接数据库
一文讲懂Go语言如何使用配置文件连接数据库 viper1. viper简介2. viper 读取.toml配置文件定义Go语言结构体编写与Go语言结构体对应的.toml配置文件定义初始化函数定义get函数 连接数据库1. 定义数据库对象2. 定义初始化函数3. 定义 get 函数4. 定义 main 函数, 连接数据库 配置…...
Jmeter使用介绍
文章目录 前言Jmeter简介安装与配置JDK安装与配置JMeter安装与配置 打开JMeter方式一方式二 设置Jmeter语言为中文方法一(仅一次性)方法二(永久设置成中文) Jmeter文件常用目录 元件与组件元件组件元件的作用域元件的执行顺序第一个案例添加线程组添加 H…...
MES机联网4:文档资料
目录信息 MES机联网1:技术方案MES机联网2:采集网关MES机联网3:管理后台MES机联网4:文档资料 MQ接入文档 1、建立连接 mqtt连接地址: 192.168.0.138 mqtt端口: 1883 mqtt用户名:admin mqtt密码:123456 …...
豆包大模型 MarsCode AI 刷题专栏 001
001.找单独的数 难度:易 问题描述 在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上…...
常用无功功率算法的C语言实现(二)
0 前言 尽管数字延迟法和积分移相法在不间断采样的无功功率计算中得到了广泛应用,但它们仍存在一些固有缺陷。 对于数字延迟法而言,其需要额外存储至少1/4周期的采样点,在高采样频率的场景下,这对存储资源的需求不可忽视。而积分移相法虽然避免了额外的存储开销,但为了抑制…...
23种设计模式简介
一、创建型(5种) 1.工厂方法 总店定义制作流程,分店各自实现特色披萨(北京店-烤鸭披萨,上海店-蟹粉披萨) 2.抽象工厂 套餐工厂(家庭装含大披萨薯条,情侣装含双拼披萨红酒&#…...
开发vue小游戏:数字华龙道
一、游戏介绍 1、历史背景 数字华容道脱胎于传统华容道,后者源自三国时期“曹操败走华容道”的故事。传统玩法是通过移动不同形状的木块,帮助“曹操”从出口逃脱。而数字华容道将棋子替换为数字,目标是通过滑动方块,将乱…...
electron的通信方式(三种)
文章目录 一、渲染进程向主进程发送消息二、渲染进程向主进程发送消息并异步获取结果三、主进程向渲染进程发送消息 electron的主要是主线程和渲染线程之间的通信,简单记录一下三种通信方式 一、渲染进程向主进程发送消息 利用ipcRenderer.send()和ipcMain.on()方法…...
MapReduce技术概述**
** MapReduce是一种并行计算框架,最初由Google开发,后来被Apache开源。它是一种分布式计算模型,能够处理大规模数据集,解决复杂的计算问题。MapReduce技术在数据处理和分析领域广泛应用,尤其是在大数据处理中。 MapR…...
ubuntu挂载固态硬盘
Ubuntu 中挂载位于 /dev/sdc1 的固态硬盘,可以按照以下步骤操作: 步骤 1:确认分区信息 首先,确保设备 /dev/sdc1 存在且已正确分区: sudo fdisk -l /dev/sdc # 查看分区表 lsblk # 确认分区路…...
同为科技智能PDU在数据中心场景的应用与解决方案
数据中心当前处于一个快速发展和技术变革的特殊时期,全新的人工智能应用正在重塑整个世界,为社会带来便捷的同时,也为数据中心的发展带来了新的机遇和挑战。智能算例的爆发式增长,对数据中心提出了大算力、高性能的新需求…...
golang学习笔记——go语言安装及系统环境变量设置
文章目录 go语言安装go envgo getgoproxy测试安装 Go 插件安装 Go 插件依赖工具参考资料用户环境变量和系统环境变量用户环境变量系统环境变量示例设置环境变量的步骤设置用户环境变量设置系统环境变量 验证环境变量总结 2024年最火的5大Go框架1. Gin:高并发接口的“…...
云服务器Linux安装Docker
系统要求 Docker 官方建议将 Docker 运行在 Linux系统上,当然也可以在其他平台运行,本篇博客只介绍在 Linux 系统上的安装方法。 Docker 运行在 CentOS7.X 版本以上,本文使用阿里云 ECS 云服务器 CentOS 7.4 版本。 Docker 需要安装在 64 …...
2025DNS二级域名分发PHP网站源码
安装教程 1.程序必须使用PHP8.1 2.将扩展ixed.8.1.lin放入/www/server/php/81/lib/php/extensions/no-debug-non-zts-20210902 3.打开宝塔→软件商店→PHP8.1→配置文件 4.放入:extensionixed.8.1.lin 5.重启PHP8.1 6.新建站点(mysql5.6-5.7andPHP8.1&a…...
审批流AntV框架蚂蚁数据可视化X6饼图(附注释)
大家好,这次使用的是AntV的蚂蚁数据可视化X6框架,类似于审批流的场景等,代码如下: X6框架参考网址:https://x6.antv.vision/zh/examples/showcase/practices#bpmn 可以进入该网址,直接复制下方代码进行调试…...
git 添加额外的远程仓库 URL
要使用 git branch -a 查看 net-next 远程仓库中的所有分支,请按照以下步骤操作: 步骤 1: 确保已添加 net-next 远程仓库 如果尚未添加 net-next 远程仓库,请运行以下命令: git remote add net-next git://git.kernel.org/pub/s…...
Qt中实现多个QMainWindow同时显示
在Qt中实现多个QMainWindow同时显示,可通过以下方法实现: 一、直接显示多个实例 必须使用new创建堆对象,避免栈对象因作用域结束被销毁。 int main(int argc, char *argv[]) {QApplication a(argc, argv);// 创建两个独立的主窗口QMainW…...
在ArcMap中通过Python编写自定义工具(Python Toolbox)实现点转线工具
文章目录 一、需求二、实现过程2.1、创建Python工具箱(.pyt)2.2、使用catalog测试代码2.3、在ArcMap中使用工具 三、测试 一、需求 通过插件的形式将点转线功能嵌入ArcMap界面,如何从零开始创建一个插件,包括按钮的添加、工具的实…...
关于AI数据分析可行性的初步评估
一、结论:可在部分环节嵌入,无法直接处理大量数据 1.非本地部署的AI应用处理非机密文件没问题,内部文件要注意数据安全风险。 2.AI(指高规格大模型)十分适合探索性研究分析,对复杂报告无法全流程执行&…...
cdn取消接口缓存
添加cdn后,使用cdn加速域名访问接口 是缓存,不是最新的数据,如果使用局域网则是最新的数据,如果修改配置,确保使用cdn域名请求的接口返回不是缓存 要确保通过CDN加速域名访问接口时返回的是最新的数据,而不…...
Android 屏幕适配 Tips
概念 屏幕尺寸:屏幕的对角线的长度屏幕分辨率:屏幕分辨率是指在横纵向上的像素点数,单位是px,1px1个像素点。一般以纵向像素x横向像素,如1960x1080屏幕像素密度:每英寸上的像素点数,单位是dpi …...
【Academy】HTTP Host 标头攻击 ------ HTTP Host header attacks
HTTP Host 标头攻击 ------ HTTP Host header attacks 1. 什么是 HTTP Host 标头?2. 什么是 HTTP Host 标头攻击?3. HTTP Host 标头漏洞是如何产生的?4. 如何测试 HTTP Host 标头漏洞4.1 提供任意 Host 标头4.2 检查有缺陷的验证4.3 发送不明…...
大模型架构记录2
一 应用场景 1.1 prompt 示例 1.2 自己搭建一个UI界面,调用接口 可以选用不同的模型,需要对应的API KEY 二 Agent 使用 2.1 构建GPT...
在Windows 11的WSL中安装Kali Linux
Kali Linux 是网络安全从业者和爱好者的首选工具集,但直接在物理机或虚拟机上运行可能占用较多资源。借助 Windows Subsystem for Linux (WSL),我们可以在Windows 11中原生运行Kali Linux,轻量且高效。本教程将手把手教你如何在WSL2中安装并配…...
Qt调试功能使用方法
QT编程环境 QT在Windows操作系统下的三种编程环境搭建。 方案编程环境编译器调试器1Qt CreatorMinGW GCCGDB2Qt CreatorMicrosoft Visual C CompilerDebugging Tools for Widows3Microsoft Visual Studio VS自带VS自带 方案提及的QT安装程序及压缩包均能在官网Index of /off…...
一篇文章讲解清楚ARM9芯片启动流程
SAM9X60 ARM9 boot启动流程关键词介绍: 第一级bootloader - 也叫boot ROM,是集成在MPU内部的ROM里面 它的主要功能是执行对MPU的基本初始化和配置,查找并将第二级bootloader从外部NVM中读取出来并放到MPU内部的SRAM. 可以让MPU强制停留在第一…...
DeepSeek未来发展趋势:开创智能时代的新风口
DeepSeek未来发展趋势:开创智能时代的新风口 随着人工智能(AI)、深度学习(DL)和大数据的飞速发展,众多创新型技术已经逐渐走向成熟,而DeepSeek作为这一领域的新兴力量,正逐步吸引越…...
Spring Boot与Axon Framework整合教程
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 简介 Axon Framework是一个用于构建CQRS(命令查询职责分离)和事件溯源(Event Sourcing)应用的框架࿰…...
从技术角度看大语言模型进化技术路线与落地应用详解:未来的最佳实践方向是什么?
文章大纲 **一、模型架构创新:从Transformer到下一代架构****二、训练与优化技术:从暴力Scaling到精细调控****三、数据与知识工程:从粗放喂养到智能增强****四、应用层进化:从通用能力到垂直场景突破****五、伦理与可持续性技术**未来技术路线图参考文献**一、大模型架构创…...
LSM-Tree (日志结构合并树)
LSM-Tree(日志结构合并树)是一种高效处理写操作的存储结构,广泛应用于NoSQL数据库如LevelDB和RocksDB。其核心思想是将随机写入转换为顺序写入,提升吞吐量。以下是其原理及Java实现示例: ### **LSM-Tree 原理** 1. **…...
自动驾驶---不依赖地图的大模型轨迹预测
1 前言 早期传统自动驾驶方案通常依赖高精地图(HD Map)提供道路结构、车道线、交通规则等信息,可参考博客《自动驾驶---方案从有图迈进无图》,本质上还是存在问题: 数据依赖性高:地图构建成本昂贵,且跨区域泛化能力受限。动态场景局限性:地图无法实时反映临时障碍物或施…...
记录一次mysql全文索引不生效
先是创建全文索引: alter table sms_img_library add fulltext index sms_img_library_title_idx(title) 但是执行下面sql,没有数据出来 select * from sms_img_library where match (title) against(壮丽);排查了最小分词,设置为2 SHOW…...
蓝桥杯题型
蓝桥杯 蓝桥杯题型分类语法基础艺术与篮球(日期问题)时间显示(时间问题)跑步计划(日期问题)偶串(字符)最长子序列(字符)字母数(进制转换)6个0&…...
用Python分割并高效处理PDF大文件
在处理大型PDF文件时,将它们分解成更小、更易于管理的块通常是有益的。这个过程称为分区,它可以提高处理效率,并使分析或操作文档变得更容易。在本文中,我们将讨论如何使用Python和为Unstructured.io库将PDF文件划分为更小的部分。…...
DeepSeek×博云AIOS:突破算力桎梏,开启AI普惠新纪元
背景 在全球人工智能技术高速迭代的背景下,算力成本高企、异构资源适配复杂、模型部署效率低下等问题,始终是制约企业AI规模化应用的关键。 DeepSeek以创新技术直击产业痛点,而博云先进算力管理平台AIOS的全面适配,则为这一技术…...
顶点着色器和片段着色器
在Unity渲染中,**顶点着色器(Vertex Shader)和片段着色器(Fragment Shader)**是图形渲染管线中的两个核心阶段。我们可以通过一个比喻来理解它们的分工:想象你要画一幅由三角形组成的3D模型,顶点…...
Uniapp打包H5端弱网络环境下存在页面UI渲染错乱问题方案实现
一.需求 uniapp打包的H5项目,首页模块的业务逻辑偏多,调用的接口数量庞大,在弱网络的情况下切换了页面或者网络较好但是页面的UI未渲染完成的情况下快速地切换了页面会出现UI渲染错乱的问题,针对该问题个人从两个方面来进行处理&…...
Dify+DeepSeek | Excel数据一键可视化(创建步骤案例)(echarts助手.yml)(文档表格转图表、根据表格绘制图表、Excel绘制图表)
Dify部署参考:Dify Rag部署并集成在线Deepseek教程(Windows、部署Rag、安装Ragan安装、安装Dify安装、安装ollama安装) DifyDeepSeek - Excel数据一键可视化(创建步骤案例)-DSL工程文件(可直接导入&#x…...
## DeepSeek写水果记忆配对手机小游戏
DeepSeek写水果记忆配对手机小游戏 提问 根据提的要求,让DeepSeek整理的需求,进行提问,内容如下: 请生成一个包含以下功能的可运行移动端水果记忆配对小游戏H5文件: 要求 可以重新开始游戏 可以暂停游戏 卡片里的水果…...
Windows系统编程(八)线程同步
线程安全问题 每个线程都有自己独立的堆栈,局部变量是存储在栈中的,这就意味着每个线程都会有一份自己的局部变量,当线程仅仅访问自己的局部变量时就不存在线程安全问题。但是全局变量是存储在全局区的,多线程共享全局变量&#…...