第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 bytes
    char name[20];  // 20 bytes
    float score;    // 4 bytes
};

// 联合体内存布局示例
union Data {
    int integer;    // 4 bytes
    double floating; // 8 bytes
    char character; // 1 byte
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek 助力 Vue3 开发:打造丝滑的悬浮按钮(Floating Action Button)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

基因枷锁下的太空梦 —— 千钧一发电影观后感

目录 1 人物介绍 2 电影名解读 3 电影开头 3.1 电影开头的两段话 3.2 片头设计 4 电影正文 4.1 “杰罗米”各种诡异的行为 4.2 文森特 – 失败的man 4.3 真正的杰罗米以及假基因身份证 4.4 文森特新征程 4.5 基因人的不容易 4.6 睫毛被查出有问题 4.7 文森特身份初…

RustDesk搭建公网中继服务器远控内网机器(完整版)

前情提要&#xff1a;最近要在学校实验室的服务器&#xff08;ubuntu&#xff09;上做实验&#xff0c;但是服务器在校园网里面&#xff0c;在外面的时候没法远控&#xff0c;todesk有时候有点卡顿&#xff0c;所以想试着用rustdesk进行远程控制。 参考博客&#xff1a; 官方…

Java Web-Filter

Filter 在 Java Web 开发中&#xff0c;Filter&#xff08;过滤器&#xff09;是 Servlet 规范中的一个重要组件&#xff0c;它可以对客户端与服务器之间的请求和响应进行预处理和后处理。以下从多个方面详细介绍 Java Web 中的 Filter&#xff1a; 一、概念和作用 概念&…

水果识别系统 | BP神经网络水果识别系统,含GUI界面(Matlab)

使用说明 代码下载&#xff1a;BP神经网络水果识别系统&#xff0c;含GUI界面&#xff08;Matlab&#xff09; BP神经网络水果识别系统 一、引言 1.1、研究背景及意义 在当今科技迅速发展的背景下&#xff0c;人工智能技术尤其是在图像识别领域的应用日益广泛。水果识别作为…

Spark核心之01:架构部署、sparkshell、程序模板

spark内存计算框架 一、主题 spark核心概念spark集群架构spark集群安装部署spark-shell的使用通过IDEA开发spark程序 二、要点 1. spark是什么 Apache Spark™ is a unified analytics engine for large-scale data processing. spark是针对于大规模数据处理的统一分析引擎…

Sparsely-Gated Mixture-of-Experts Layer (MoE)论文解读与Pytorch代码实现

MoE解析 阅读论文&#xff1a;https://arxiv.org/pdf/1701.06538 OUTRAGEOUSLY LARGE NEURAL NETWORKS:THE SPARSELY-GATED MIXTURE-OF-EXPERTS LAYER 本文介绍了一种名为Sparsely-Gated Mixture-of-Experts Layer (MoE) 的神经网络组件&#xff0c;旨在通过条件计算&#xf…

线性模型 - 支持向量机

支持向量机&#xff08;SVM&#xff09;是一种用于分类&#xff08;和回归&#xff09;的监督学习算法&#xff0c;其主要目标是找到一个最佳决策超平面&#xff0c;将数据点分为不同的类别&#xff0c;并且使得分类边界与最近的数据点之间的间隔&#xff08;margin&#xff09…

利用STM32TIM自制延迟函数实验

一、实验目的 掌握STM32定时器&#xff08;TIM&#xff09;的工作原理及配置方法学习使用HAL库实现微秒级/毫秒级延时函数理解定时器中断服务程序的编写规范 二、实验原理 ​定时器基础&#xff1a; STM32定时器包含向上计数器、向下计数器、中心对齐模式通过预分频器&#x…

mac安装环境

minconda https://docs.anaconda.net.cn/miniconda/install/ 注意在下载下来应该有100多兆&#xff0c;太大了应该是完整版&#xff0c;我们不需要 jdk 镜像网站下载设置环境变量&#xff1a; 终端&#xff1a;sudo vim ~/.zshrc # JDK Config JAVA_HOME/Library/Java/Java…

视觉图像坐标转换

1. 透镜成像 相机的镜头系统将三维场景中的光线聚焦到一个平面&#xff08;即传感器&#xff09;。这个过程可以用小孔成像模型来近似描述&#xff0c;尽管实际相机使用复杂的透镜系统来减少畸变和提高成像质量。 小孔成像模型&#xff1a; 假设有一个理想的小孔&#xff0c;…

计算机毕业设计SpringBoot+Vue.js景区民宿预约系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【LeetCode: SQL专题 : SQL132 每个题目和每份试卷被作答的人数和次数 + 合并查询】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

动态内容加载的解决方案:Selenium与Playwright对比故障排查实录

方案进程 2024-09-01 09:00 | 接到亚航航班数据采集需求 2024-09-01 11:30 | 首次尝试使用Selenium遭遇Cloudflare验证 2024-09-01 14:00 | 切换Playwright方案仍触发反爬机制 2024-09-01 16:30 | 引入爬虫代理IPUA轮换策略 2024-09-02 10:00 | 双方案完整实现并通过压力测试故…

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

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

利用 Python 爬虫进行跨境电商数据采集

1 引言2 代理IP的优势3 获取代理IP账号4 爬取实战案例---&#xff08;某电商网站爬取&#xff09;4.1 网站分析4.2 编写代码4.3 优化代码 5 总结 1 引言 在数字化时代&#xff0c;数据作为核心资源蕴含重要价值&#xff0c;网络爬虫成为企业洞察市场趋势、学术研究探索未知领域…

【数据挖掘】Matplotlib

Matplotlib 是 Python 最常用的 数据可视化 库之一&#xff0c;在数据挖掘过程中&#xff0c;主要用于 数据探索 (EDA)、趋势分析、模式识别 和 结果展示。 &#x1f4cc; 1. Matplotlib 基础 1.1 安装 & 导入 # 如果未安装 Matplotlib&#xff0c;请先安装 # pip instal…

使用Java构建高效的Web服务架构

使用Java构建高效的Web服务架构 随着互联网技术的飞速发展&#xff0c;Web服务在现代应用中扮演着至关重要的角色。尤其是在企业级应用中&#xff0c;如何构建一个高效、可扩展且易维护的Web服务架构&#xff0c;成为了开发者和架构师面临的一项重要挑战。Java作为一种成熟、稳…

数据库MySQL,在终端输入后,提示不是内部命令等

【解决问题】mysql提示不是内部或外部命令&#xff0c;也不是可运行的程序 一般这种问题是因为没有在系统变量里面添加MySQL的可执行路径 以下是添加可执行路径的方法&#xff1a; 第一步&#xff1a;winR输入services.msc 然后找到MySQL&#xff0c;右击属性并复制MySQL的可执…

LabVIEW正弦信号处理:FFT与最小二乘拟合的参数提取

问题一&#xff1a;LabVIEW能否对采集的正弦力信号进行快速傅里叶变换&#xff08;FFT&#xff09;&#xff0c;并得到幅值和相位结果&#xff1f; 答案&#xff1a; 可以。LabVIEW通过内置信号处理工具包提供完整的FFT分析功能&#xff0c;具体实现如下&#xff1a; FFT分析流…