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

server/2025/3/3 17:40:07/

第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.ppmy.cn/server/172133.html

相关文章

微前端架构深度解析:从组合式应用到模块联邦

引言&#xff1a;万亿级流量的前端架构革命 Amazon将主站迁移至微前端架构后&#xff0c;独立模块发布速度提升800%&#xff0c;日均部署次数突破1500次。阿里巴巴采用qiankun框架重构跨BU应用&#xff0c;首屏加载性能提升320%&#xff0c;资源复用率达92%。Salesforce通过Mo…

JavaScript 输入输出语句

在JavaScript中&#xff0c;输入和输出是与用户进行直接互动的关键方式。通过输入&#xff0c;我们可以从用户那里获取信息&#xff1b;通过输出&#xff0c;我们能向用户展示处理结果或其他重要信息。本文将详细介绍几种常见的JavaScript输入输出方法及其应用场景。 输出语句…

Kubernetes中的HeadlessService

在Kubernetes中&#xff0c;Service是一种抽象概念&#xff0c;它定义了一组Pod的逻辑集合以及访问这些Pod的策略。而HeadlessService&#xff08;无头服务&#xff09;是Service的一种特殊类型。 当创建Service时&#xff0c;将spec.clusterIP字段设置为None&#xff0c;就会…

使用mermaid查看cursor程序生成的流程图

一、得到cursor生成的流程图文本 cursor写的程序正常运行后&#xff0c;在对话框输入框中输入诸如“请生成扫雷的代码流程图”&#xff0c;然后cursor就把流程图给生成了&#xff0c;但是看到的还是文本的样子&#xff0c;保留这部分内容待用 二、注册一个Mermaid绘图账号 …

【SpringBoot+Vue】博客项目开发二:用户登录注册模块

后端用户模块开发 制定参数交互约束 当前&#xff0c;我们使用MybatisX工具快速生成的代码中&#xff0c;包含了一个实体类&#xff0c;这个类中包含我们数据表中的所有字段。 但因为有些字段&#xff0c;是不应该返回到前端的&#xff0c;比如用户密码&#xff0c;或者前端传…

ssm整合项目实现基础查询功能

目录 实现 1. 首先创建数据库 2. 创建项目 3. 右键main创建资源目录 4. 部署服务器 5. 注入相关依赖 6.创建层结构 7. 配置Spring 8. 配置SpringMVC 9. 配置Mybatis 10.创建实体类 11.创建Mapper接口和sql映射文件 12.创建服务层 13. 创建控制器层 实现 1. 首先创建数…

如何在 FastAdmin 中实现自定义主题设计

如何在 FastAdmin 中实现自定义主题设计 FastAdmin 是一个基于 ThinkPHP 和 Bootstrap 的快速开发框架&#xff0c;广泛用于构建管理后台。为了满足不同项目的需求&#xff0c;FastAdmin 允许开发者自定义主题设计。本文将介绍如何在 FastAdmin 中实现自定义主题设计&#xff…

《OpenCV》—— dlib库

文章目录 dlib库是什么&#xff1f;OpenCV库与dlib库对比dlib库安装dlib——人脸应用实例——人脸检测dlib——人脸应用实例——人脸关键点定位dlib——人脸应用实例——人脸轮廓绘制 dlib库是什么&#xff1f; OpenCV库与dlib库对比 dlib库安装 dlib——人脸应用实例——人脸检…