第8天:面向对象编程入门 - 类与对象

第8天:面向对象编程入门 - 类与对象

一、📚 今日学习目标

  1. 🎯 掌握类与对象的定义与使用
  2. 🔧 理解封装、继承、多态三大特性
  3. 💡 完成银行账户管理系统实战
  4. 🛠️ 学会构造函数与析构函数的编写

二、⚙️ 核心知识点详解

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:图书馆管理系统扩展(知识点拆解)

📚 核心知识点
  1. 结构体扩展

    • 在原有LibraryBook结构体中添加borrowerNameisBorrowed字段
    • 示例代码:
      struct LibraryBook {string isbn;string title;string author;double price;string borrowerName;bool isBorrowed;
      };
      
  2. 动态数据管理

    • 使用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;
      }
      
  3. 范围查询实现

    • 按价格区间筛选图书:
      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:时间格式转换程序(深入解析)

🔍 关键知识点
  1. 联合体(Union)的特性

    • 所有成员共享同一块内存地址
    • 示例内存布局:
      totalSeconds (int) | hours (int) | minutes (int) | seconds (int)
      -----------------------------------------------
      0x0000           | 0x0004       | 0x0008        | 0x000C
      
  2. 类型转换方法

    • 通过成员访问符切换不同视图:
      Time t;
      t.totalSeconds = 3661; // 初始化为总秒数
      cout << "小时:" << t.hours << endl; // 自动转换显示
      
  3. 取模运算原理

    • 计算时分秒的数学公式:
      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
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/72288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop之02:MapReduce编程模型

MapReduce编程模型 理解MapReduce编程模型独立完成一个MapReduce程序并运行成功了解MapReduce工程流程掌握并描述出shuffle全过程&#xff08;面试&#xff09;独立编写课堂及作业中的MR程序理解并解决数据倾斜 1. MapReduce编程模型 Hadoop架构图 Hadoop由HDFS分布式存储、M…

2.7 大模型RAG内容安全合规检查-大模型ACP模拟题-真题

单选题 在RAG应用中&#xff0c;输入内容合规检查的正确顺序是&#xff1f; A. 先处理模型生成&#xff0c;后检查用户输入 B. 先检查用户输入&#xff0c;后处理模型生成 ✅ C. 仅检查用户输入 D. 仅检查模型输出 解析&#xff1a;合规流程应优先过滤用户输入风险&#xff0…

mapbox基础,使用geojson加载heatmap热力图层

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️heatmap热力图层样式二、🍀使用geojs…

Deepseek Api Function Calling解析(tools、tool_calls)Deepseek函数调用流程图、Python代码示例

文章目录 Function Calling介绍**核心原理**1. **动态扩展模型能力**2. **JSON结构化交互** **实现步骤**&#xff08;以支持Function Calling的模型为例&#xff09;1. **定义可用函数**2. **模型匹配与生成**3. **开发者执行函数**4. **结果反馈给模型** **DeepSeek R1的当前…

在2023idea中如何创建SpringBoot

目录 一.下载和安装 Maven 1.前往 https://maven.apache.org/download.cgi 下载最新版的 Maven 程序 2.将文件解压到D:Program FilesApachemaven目录 3.新建环境变量MAVEN_HOME&#xff0c;赋值D:Program FilesApachemaven 4.编辑环境变量Path&#xff0c;追加%MAVEN_HOME…

基于YOLO11深度学习的遥感视角农田检测与分割系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标分割、人工智能

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

用冒泡排序法模拟qsort函数

目录 1.前言 2.qsort函数的介绍 ​3.冒泡法回顾 4.模拟qsort---buble_sort 4.1 buble_sort格式 4.2 主函数&#xff0c;以int类型为例 4.3comp_int函数的功能设计 4.4 swap函数的功能设计 5. 总代码概览 1.前言 今天&#xff0c;小邓儿带大家用冒泡排序法来模拟一下qs…

全星研发项目管理APQP软件系统:铸造芯片集成电路产业研发体系化建设平台

全星研发项目管理APQP软件系统&#xff1a;铸造芯片集成电路产业研发体系化建设平台 在芯片集成电路行业&#xff0c;研发效率和质量直接决定了企业的核心竞争力。面对日益复杂的芯片设计、日益缩短的产品生命周期以及日益严格的质量要求&#xff0c;传统的研发管理模式已难以满…

《Python实战进阶》No 11:微服务架构设计与 Python 实现

第11集&#xff1a;微服务架构设计与 Python 实现 2025年3月3日更新了代码和微服务运行后的系统返回信息截图&#xff0c;所有代码在 python3.11.5虚拟环境下运行通过。 微服务架构通过将复杂应用拆分为独立部署的小型服务&#xff0c;显著提升了系统的可扩展性和维护性。本集…

USRP7440-通用软件无线电平台

1、产品描述 USRP7440基于第三代XILINX Zynq UltraScale RFSoC架构&#xff0c;它将射频ADC、DAC、ARM、FPGA等集成一体&#xff0c;瞬时带宽可以达到2.5GHz&#xff0c;尤其适合于射频直采应用&#xff0c;比如通信与雷达。 第一代RFSOC高达4GHz • 8x 或 16x 6.554GSPS DAC…

1.2.3 使用Spring Initializr方式构建Spring Boot项目

本实战概述介绍了如何使用Spring Initializr创建Spring Boot项目&#xff0c;并进行基本配置。首先&#xff0c;通过Spring Initializr生成项目骨架&#xff0c;然后创建控制器HelloController&#xff0c;定义处理GET请求的方法hello&#xff0c;返回HTML字符串。接着&#xf…

【小羊肖恩】小羊杯 Round 2 C+K

题目链接&#xff1a;https://ac.nowcoder.com/acm/contest/100672#question C.是毛毛虫吗&#xff1f; 思路&#xff1a; 其实很简单&#xff0c;假设我们要满足题目所给条件&#xff0c;那么这个毛毛虫最坏情况下肯定是一条如下图所示的无向图 右端省略号为对称图形 &…

不谓侠--记录

音乐《不谓侠》 衣襟上 别好了晚霞 余晖送我牵匹老马 正路过 烟村里人家 恰似当年故里正飞花 醉过风 喝过茶 寻常巷口寻个酒家 在座皆算老友 碗底便是天涯 天涯远 无处不为家 蓬门自我也像广厦 论意气 不计多或寡 占三分便敢自称为侠 刀可捉 拳也耍 偶尔闲来…

不同规模企业如何精准选择AI工具: DeepSeek、Grok 和 ChatGPT 三款主流 AI 工具深度剖析与对比

本文深入探讨了最近国内外主流的 DeepSeek、Grok 和 ChatGPT 三款主流 AI 工具的技术细节、性能表现、应用场景及局限性&#xff0c;并从技术能力、功能需求、成本预算、数据安全和合规以及服务与支持五个关键维度&#xff0c;详细分析了不同规模企业在选择 AI 工具时的考量因素…

Vue核心知识:KeepLive全方位分析

KeepAlive 是 Vue 组件中的一个重要功能&#xff0c;主要用于缓存组件&#xff0c;以提升性能和用户体验。 目录 一、KeepAlive 基本概念二、KeepAlive 的核心原理三、KeepAlive 关键属性解析1. include&#xff1a;指定需要缓存的组件2. exclude&#xff1a;指定不需要缓存的组…

【电力——tarjan割点,求连通块】

题目 分析 这是割点的板子 代码 #include <bits/stdc.h> using namespace std;const int N 1e410; const int M 3e410;int h[N], e[M], ne[M], idx; int dfn[N], low[N], tot; int root, ans;void add(int a, int b) // 添加一条边a->b {e[idx] b, ne[idx] h…

【HTTP】解码网络通信的奥秘:HTTP,IP 地址,端口,DNS及NAT地址转换的协同之舞

引言 每文学习一句诗&#xff1a;行一棋不足以见智&#xff0c;弹一弦不足以见悲 ——《淮南子说林训》 译文&#xff1a;走一个棋子&#xff0c;不足以现出智慧&#xff1b;弹一根琴弦&#xff0c;不能够使人产生悲哀之情。 自述&#xff1a;互联网现如今已经成为每个人都离不…

18、深拷贝与浅拷贝的区别【中高频】

浅拷贝 浅拷贝只是拷贝了一个指针&#xff0c;并没有开辟一块新的内存。拷贝的指针和原来的指针 指向同一块地址。当一个对象修改了资源&#xff0c;另一个对象也会受到影响&#xff0c;因此浅拷贝是有风险的&#xff1a;当两个对象都销毁 并调用析构函数时&#xff0c;会造成…

【Linux】从入门到精通:Make与Makefile完全指南

欢迎来到 CILMY23 的博客 &#x1f3c6;本篇主题为&#xff1a;从入门到精通&#xff1a;Make与Makefile完全指南 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;C | C语言 | Linux | Python | 数据结构和算法 | 算法专题 &#x1…

利用PyQt简单的实现一个机器人的关节JOG界面

在上一篇文章中如何在Python用Plot画出一个简单的机器人模型&#xff0c;我们介绍了如何在Python中画出一个简单的机器人3D模型&#xff0c;但是有的时候我们需要通过界面去控制机器人每一个轴的转动&#xff0c;并实时的显示出当前机器人的关节位置和末端笛卡尔位姿。 那么要实…