第8天:面向对象编程入门 - 类与对象
第8天:面向对象编程入门 - 类与对象
一、📚 今日学习目标
- 🎯 掌握类与对象的定义与使用
- 🔧 理解封装、继承、多态三大特性
- 💡 完成银行账户管理系统实战
- 🛠️ 学会构造函数与析构函数的编写
二、⚙️ 核心知识点详解
1. 类的定义与对象创建
类的基本结构
class BankAccount {
private:string accountNumber;double balance;public:// 构造函数BankAccount(string accNo, double initialBalance) : accountNumber(accNo), balance(initialBalance) {}// 成员函数void deposit(double amount) {balance += amount;}bool withdraw(double amount) {if (balance >= amount) {balance -= amount;return true;}return false;}double getBalance() const {return balance;}
};// 创建对象
BankAccount myAccount("123456", 1000.0);
2. 封装与访问控制
成员访问修饰符
class Person {
public: // 公有成员string name;
protected: // 受保护成员int age;
private: // 私有成员string idCard;
};
3. 继承与多态
继承语法
class SavingsAccount : public BankAccount {
private:double interestRate;public:SavingsAccount(string accNo, double initialBalance, double rate): BankAccount(accNo, initialBalance), interestRate(rate) {}void addInterest() {balance += balance * interestRate / 100;}
};
三、🔧 代码实战:银行账户管理系统
1. 功能需求
- 创建不同类型的账户(储蓄/支票)
- 存款/取款操作
- 计算利息(仅储蓄账户)
2. 实现步骤
#include <iostream>
#include <vector>
#include <string>
using namespace std;class Account {
protected:string accountNumber;double balance;
public:Account(string accNo, double amt) : accountNumber(accNo), balance(amt) {}virtual void display() const = 0; // 纯虚函数
};class SavingsAccount : public Account {
private:double interestRate;
public:SavingsAccount(string accNo, double amt, double rate): Account(accNo, amt), interestRate(rate) {}void deposit(double amt) {balance += amt;}void withdraw(double amt) {if (balance >= amt) {balance -= amt;}}void addInterest() {balance += balance * interestRate / 100;}void display() const override {cout << "储蓄账户(" << accountNumber << "):余额$" << balance << endl;}
};class CheckingAccount : public Account {
public:CheckingAccount(string accNo, double amt): Account(accNo, amt) {}void deposit(double amt) {balance += amt;}bool withdraw(double amt) {if (balance >= amt) {balance -= amt;return true;}return false;}void display() const override {cout << "支票账户(" << accountNumber << "):余额$" << balance << endl;}
};int main() {vector<Account*> accounts;// 创建账户accounts.push_back(new SavingsAccount("SA123", 5000, 2.5));accounts.push_back(new CheckingAccount("CA456", 2000));// 存款操作accounts[0]->deposit(1000);accounts[1]->deposit(500);// 取款操作accounts[0]->withdraw(200);accounts[1]->withdraw(1500); // 余额不足// 显示所有账户cout << "\n📊 账户信息:" << endl;for (const auto& acc : accounts) {acc->display();}// 清理内存for (auto acc : accounts) {delete acc;}return 0;
}
四、🛠️ 进阶技巧
1. 构造函数初始化列表
class Point {
public:Point(double x, double y) : x(x), y(y) {} // 直接初始化成员变量
private:double x, y;
};
2. 多态实现原理
// 纯虚函数声明
virtual void draw() = 0;// 重写(override)关键字(C++11)
void draw() override;
3. 抽象类与接口
class Shape { // 抽象类
public:virtual void draw() = 0; // 纯虚函数
};class Circle : public Shape {
public:void draw() override { /* 绘制圆 */ }
};
五、❓ 常见问题解答
Q:类和结构体有什么本质区别?
→ 默认访问权限不同(类private/结构体public),设计意图不同(类强调封装/结构体侧重数据组织)
Q:什么是虚函数?
→ 用于实现多态机制的成员函数,通过virtual关键字声明
Q:构造函数可以调用虚函数吗?
→ 不建议,此时虚函数调用的是基类的实现而非派生类
六、📝 今日总结
✅ 成功掌握:
- 🔑 类的定义与对象创建方法
- 🔒 封装实现数据隐藏
- 🌟 继承与多态的基本应用
- 💡 构造函数/析构函数的编写规范
⏳ 明日预告:
- 模板编程基础(泛型编程)
七、📝 课后挑战任务
1.🌟 完善银行系统:
- 添加账户类型判断功能
- 实现按账户类型统计总金额
2. 🔍 抽象类应用:
// 完成图形面积计算程序
class Shape {
public:virtual double area() = 0;
};class Circle : public Shape {
private:double radius;
public:Circle(double r) : radius(r) {}double area() override { return 3.14 * radius * radius; }
};class Rectangle : public Shape {
private:double width, height;
public:Rectangle(double w, double h) : width(w), height(h) {}double area() override { return width * height; }
};int main() {Shape* shapes[2];shapes[0] = new Circle(5);shapes[1] = new Rectangle(4, 6);cout << "总面积:" << shapes[0]->area() + shapes[1]->area() << endl;// 释放内存delete[] shapes;return 0;
}
3.📝 技术总结:
- 列举面向对象编程的5个典型应用场景
🔍 上一天课后挑战任务答案
任务1:图书馆管理系统扩展(知识点拆解)
📚 核心知识点
-
结构体扩展
- 在原有
LibraryBook结构体中添加borrowerName和isBorrowed字段 - 示例代码:
struct LibraryBook {string isbn;string title;string author;double price;string borrowerName;bool isBorrowed; };
- 在原有
-
动态数据管理
- 使用
vector<LibraryBook>存储图书信息 - 添加借阅逻辑:
// 借阅操作 void borrowBook(vector<LibraryBook>& books, const string& isbn, const string& name) {for (auto& book : books) {if (book.isbn == isbn && !book.isBorrowed) {book.borrowerName = name;book.isBorrowed = true;cout << "📖《" << book.title << "》已借出!" << endl;return;}}cout << "📝 该书不可借阅或已被借出!" << endl; }
- 使用
-
范围查询实现
- 按价格区间筛选图书:
vector<LibraryBook> filterByPrice(const vector<LibraryBook>& books, double minPrice, double maxPrice) {vector<LibraryBook> result;for (const auto& book : books) {if (book.price >= minPrice && book.price <= maxPrice) {result.push_back(book);}}return result; }
- 按价格区间筛选图书:
🛠️ 实现技巧
- 数据持久化:使用文件流保存借阅记录(
fstream) - 界面优化:添加菜单循环和输入验证
- 异常处理:处理无效ISBN输入(
cin.fail())
任务2:时间格式转换程序(深入解析)
🔍 关键知识点
-
联合体(Union)的特性
- 所有成员共享同一块内存地址
- 示例内存布局:
totalSeconds (int) | hours (int) | minutes (int) | seconds (int) ----------------------------------------------- 0x0000 | 0x0004 | 0x0008 | 0x000C
-
类型转换方法
- 通过成员访问符切换不同视图:
Time t; t.totalSeconds = 3661; // 初始化为总秒数 cout << "小时:" << t.hours << endl; // 自动转换显示
- 通过成员访问符切换不同视图:
-
取模运算原理
- 计算时分秒的数学公式:
hours = totalSeconds / 3600 remaining = totalSeconds % 3600 minutes = remaining / 60 seconds = remaining % 60
- 计算时分秒的数学公式:
🎯 进阶应用
- 时区转换:添加时区偏移量参数
- 闰年判断:扩展日期计算功能
- 时间格式化:输出ISO 8601标准格式(
YYYY-MM-DD HH:MM:SS)
任务3:技术总结表(知识点扩展)
| 应用场景 | 结构体设计要点 | 实际开发建议 |
|---|---|---|
| 学生信息管理 | 包含学号/姓名/成绩/年级 | 使用std::vector存储动态数据 |
| 几何图形计算 | 包含坐标/面积/周长 | 重载运算符(如+表示向量相加) |
| 文件元数据存储 | 包含创建时间/修改时间/大小 | 使用struct代替class提升效率 |
| 通信协议解析 | 包含版本号/数据长度/校验和 | 添加序列化(serialization)功能 |
📊 内存对比示意图
// 结构体内存布局示例
struct Student {int id; // 4 byteschar name[20]; // 20 bytesfloat score; // 4 bytes
};// 联合体内存布局示例
union Data {int integer; // 4 bytesdouble floating; // 8 byteschar character; // 1 byte
};
相关文章:
第8天:面向对象编程入门 - 类与对象
第8天:面向对象编程入门 - 类与对象 一、📚 今日学习目标 🎯 掌握类与对象的定义与使用🔧 理解封装、继承、多态三大特性💡 完成银行账户管理系统实战🛠️ 学会构造函数与析构函数的编写 二、⚙️ 核心知…...
单细胞marker基因表达密度图-(还有一个包装函数)
有小伙伴说想要做单细胞marker基因表达密度图,我一想,好像之前是做过的(单细胞marker基因可视化的补充---密度图与等高线图)。但是他又说没有文献中的效果。后来我一看,是因为着色的问题。其实用Nebulosa包(…...
python多线程之Event机制笔记
Event 事件 笔记 1. 基本概念 threading.Event 是 Python 线程同步的基础组件,本质是一个布尔标志位,提供跨线程的事件通知机制。 2. 核心方法 方法作用描述set()设置事件为 True,唤醒所有等待线程clear()重置事件为 Falsewait(timeoutNo…...
记忆化搜索与动态规划:原理、实现与比较
记忆化搜索和动态规划是解决优化问题的两种重要方法,尤其在处理具有重叠子问题和最优子结构性质的问题时非常有效。 目录 1. 记忆化搜索(Memoization) 定义: 实现步骤: 示例代码(斐波那契数列࿰…...
架构师面试(九):缓存一致性
问题 关于【数据库和缓存】一致性,下面哪几项是在线上生产环境中相对合理的处理方式? A. 对于查询操作,先查缓存,如果为空则查 DB,然后将数据带入缓存; B. 对于插入操作,只写 DB 即可&#…...
Spring Boot集成Spring Ai框架【详解 搭建Spring Ai项目,以及简单的ai大模型智能体应用,附有图文+示例代码】
文章目录 一.Spring Ai介绍1.0 认识Spring Ai1.1 特征1.1 大模型专业名字介绍1.1.1 RAG(检索增强生成)RAG 的基本原理RAG 的关键技术RAG 的优势RAG 的应用场景 1.1.2 fine-tuning(微调)1.1.3 function-call(函数调用) 1.2 创建简单的Spring Ai项目 二.Spring Ai简单的智能应用2…...
OpenHarmony启动系统-U-Boot简介和源码下载与编译
OpenHarmony系统启动流程简述 设备上电后,OpenHarmony系统大致经历以下3个阶段: 1.BootRom代码引导加载UBoot; 2.UBoot启动初始化硬件资源,引导并加载系统内核(Linux内核); 3.Kernel(LiteOs,Linux内核)启动、加载驱动…...
Metal 学习笔记六:坐标空间
要在网格上轻松找到一个点,您需要一个坐标系。例如,如果网格恰好是您的 iPhone 15 屏幕,则中心点可能是 x:197、y:426。但是,该点可能会有所不同,具体取决于它所处的空间。 在上一章中…...
React + TypeScript 实现 SQL 脚本生成全栈实践
React TypeScript 实现数据模型驱动 SQL 脚本生成全栈实践 引言:数据模型与 SQL 的桥梁革命 在现代化全栈开发中,数据模型与数据库的精准映射已成为提升开发效率的关键。传统手动编写 SQL 脚本的方式存在模式漂移风险高(Schema Drift&#…...
执行git操作时报错:`remote: [session-b8xxxda3] Access denied ...`解决方案
问题描述: 执行git push -u origin "master"时报错: > remote: [session-b849cda3] Access denied > fatal: unable to access https://gitee.com/jyunee/maibobo.git/: The requested URL returned error: 403表示没有权限访问远程仓库…...
brew search报错,xcrun:error:invalid active developer path CommandLineTools
问题出现的原因 出现“xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun”错误,通常是因为Xcode命令行工具未正确安装或其路径已损坏。以下是几种常见的…...
Java测试框架Mockito快速入门
Mockito结合TestNG快速入门 什么是Mockito Mockito 是一个专门用于 Java 的强大测试框架,主要用来创建和管理模拟对象,辅助开发者进行单元测试,具有以下特点和功能: 创建模拟对象:能通过简洁的语法创建类或接口的模…...
删除idea recent projects 记录
1、退出idea(一定要全部退出idea,要不然删除后,idea一退出,又保存上了) 2、进入 C:\Users\Administrator\AppData\Roaming\JetBrains\IntelliJIdea2024.1\options 目录 根据不同的版本号 IntelliJIdea2024.1 这个地方…...
16.2 LangChain 表达式语言设计哲学:重新定义大模型应用开发范式
LangChain 表达式语言设计哲学:重新定义大模型应用开发范式 关键词:LCEL 设计哲学、声明式编程范式、生产级应用架构、流式处理优化、模块化组合 1. 核心设计目标全景图 mindmap root((LCEL设计目标)) 开发效率 声明式编程 类型提示系统 自动补全支持 工程可靠性 错…...
LabVIEW 无法播放 AVI 视频的编解码器解决方案
用户在 LabVIEW 中使用示例程序 Read AVI File.vi(路径: 📌 C:\Program Files (x86)\National Instruments\LabVIEW 2019\examples\Vision\Files\Read AVI File.vi)时发现: ✅ LabVIEW 自带的 AVI 视频可正常播放 这是…...
【Java进阶】java设计模式之单例模式
一、单例设计模式的基本概念 在 Java 编程的广阔天地里,单例设计模式宛如一颗璀璨的明星,是一种极为实用的创建型设计模式。它的核心使命是确保一个类在整个应用程序的生命周期内仅仅存在一个实例,并且为外界提供一个全局唯一的访问点来获取…...
AI编程界的集大成者——通义灵码AI程序员
一、引言 随着软件行业的快速发展和技术的进步,人工智能(AI)正在成为软件开发领域的一个重要组成部分。近年来,越来越多的AI辅助工具被引入到开发流程中,旨在提高效率、减少错误并加速创新。在这样的背景下࿰…...
第三十三:6.3. 【mitt】 任意组件通讯
概述:与消息订阅与发布(pubsub)功能类似,可以实现任意组件间通信。 // 引入mitt import mitt from "mitt";// 创建emitter const emitter mitt()/*// 绑定事件emitter.on(abc,(value)>{console.log(abc事件被触发,…...
6.7 数据库设计
文章目录 数据库设计6个阶段新奥尔良法完整导图 数据库设计6个阶段 数据库设计是指,根据应用环境,构造数据库模式,建立数据库、应用系统,实现有效地数据存储,以满足用户需求。 数据库设计过程包含6个阶段 数据库规划&…...
Java 大视界 -- Java 大数据在智能安防入侵检测与行为分析中的应用(108)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
Vue3实现文件上传、下载及预览全流程详解(含完整接口调用)
文章目录 一、环境准备1.1 创建Vue3项目1.2 安装依赖1.3 配置Element Plus 二、文件上传实现2.1 基础上传组件2.2 自定义上传逻辑(Axios实现) 三、文件下载实现3.1 直接下载(已知文件URL)3.2 后端接口下载(二进制流&am…...
【云原生】SpringCloud-Spring Boot Starter使用测试
目录 Spring Boot Starter是什么? 以前传统的做法 使用 Spring Boot Starter 之后 starter 的理念: starter 的实现: ?创建Spring Boot Starter步骤 在idea新建一个starter项目、直接执行下一步即可生成项目。 ?在xml中加入如下配置…...
介绍下pdf打印工具类 JasperPrint
JasperPrint 工具类深度解析 JasperPrint 是 JasperReports 框架中实现 PDF 打印的核心载体类,其本质是 填充数据后的可打印报表对象,承担着从模板编译、数据填充到格式输出的全流程控制。以下从 7 个维度展开深度解析: 一、核心定位与生命周…...
idea中或pycharm中编写Markdown文件
参考 ltjt_aiseek: seek_backend_py 项目 数智科技ai探索API接口开发 1. 安装 Django 框架 在开始创建 Django 项目之前,需要先安装 Django 框架。可以通过 PyCharm 的终端或者系统的命令行工具来完成安装。 使用 PyCharm 终端安装 打开 PyCharm,如果…...
Go红队开发—并发编程
文章目录 并发编程go协程chan通道无缓冲通道有缓冲通道创建⽆缓冲和缓冲通道 等协程sync.WaitGroup同步Runtime包Gosched()Goexit() 区别 同步变量sync.Mutex互斥锁atomic原子变量 SelectTicker定时器控制并发数量核心机制 并发编程阶段练习重要的细节端口扫描股票监控 并发编程…...
使用自动化运维工具 Ansible 集中化管理服务器
一、概述 Ansible 是一款为类 Unix 系统开发的自由开源的配置和自动化工具 官方网站:https://www.ansible.com/ Ansible 成立于 2013 年,总部设在北卡罗来纳州达勒姆,联合创始人 ad Ziouani 和高级副总裁 Todd Barr都是红帽的老员工。Ansible 旗下的开源软件 Ansible 十分…...
数据集笔记:新加坡 一些交通的时间序列统计量
1 机动车年度保有量 data.gov.sg 各类机动车年度保有量 数据范围:2005年1月 - 2020年12月 1.1 数据说明 非高峰时段车辆 包括周末车(Weekend Cars)和 修订版非高峰时段车辆(Revised Off Peak Cars),该…...
企业jsapi_ticket,java举例
在企业微信开发中,使用 Java 获取 jsapi_ticket 并生成签名的步骤如下。以下是完整的 Java 示例代码。 1. 获取 jsapi_ticket 的流程 获取 access_token。 使用 access_token 获取 jsapi_ticket。 使用 jsapi_ticket 生成签名(signature)。…...
【FL0090】基于SSM和微信小程序的球馆预约系统
🧑💻博主介绍🧑💻 全网粉丝10W,CSDN全栈领域优质创作者,博客之星、掘金/知乎/b站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战,以及程序定制化开发…...
智能图像处理平台:图像处理配置类
这里我们先修改一下依赖,不用JavaCV,用openCV。 导入依赖: <!-- JavaCV 依赖,用于图像和视频处理 --> <!-- <dependency>--> <!-- <groupId>org.bytedeco</groupId>--> &l…...
