「C++系列」数据抽象

人工智能教程】,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。

点击跳转到网站:【人工智能教程

一、数据抽象

在C++中,数据抽象是一种重要的面向对象编程(OOP)原则,它关注于将数据和操作这些数据的行为(即方法或函数)结合在一起,形成一个独立的单元(通常是一个类)。这种封装使得外部代码只能通过类的接口(即公共成员函数)来访问数据,而不能直接访问类的内部表示(即私有或受保护的成员变量)。这有助于隐藏实现细节,减少错误,并提高代码的可维护性和可重用性。

1. 实现数据抽象的关键步骤

  1. 定义类
    首先,定义一个类来表示你想要抽象的数据。这个类将包含私有或受保护的成员变量(用于存储数据)和公共成员函数(用于访问和修改这些数据)。
  2. 封装数据
    使用私有(private)或受保护(protected)访问修饰符来封装类的成员变量。这阻止了外部代码直接访问这些变量,从而提高了数据的安全性。
  3. 提供接口
    通过公共成员函数(也称为访问器或修改器)为类的外部提供接口。这些函数允许外部代码以受控的方式访问或修改类的内部状态。
  4. 实现逻辑
    在类的成员函数内部实现处理数据的逻辑。这些函数可能包括构造函数、析构函数、以及各种用于实现类行为的方法。

2. 示例

下面是一个简单的C++类示例,展示了如何实现数据抽象:

#include <iostream>
using namespace std;

class Rectangle {
    
    
private:
    double width;
    double height;

public:
    // 构造函数
    Rectangle(double w, double h) : width(w), height(h) {
    
    }

    // 获取面积
    double getArea() const {
    
    
        return width * height;
    }

    // 设置宽度
    void setWidth(double w) {
    
    
        width = w;
    }

    // 设置高度
    void setHeight(double h) {
    
    
        height = h;
    }
};

int main() {
    
    
    Rectangle rect(4.0, 5.0);
    cout << "Area: " << rect.getArea() << endl;

    rect.setWidth(6.0);
    rect.setHeight(7.0);
    cout << "New Area: " << rect.getArea() << endl;

    return 0;
}

在这个例子中,Rectangle类封装了矩形的宽度和高度数据,并通过公共成员函数getArea(), setWidth(), 和 setHeight()提供了访问和修改这些数据的接口。外部代码不能直接访问widthheight成员变量,这有助于保护数据的完整性和一致性。

二、应用场景

C++中的数据抽象是一种强大的编程技术,广泛应用于各种软件开发场景中。它通过将数据和操作这些数据的函数封装在类中,实现了对数据的隐藏和保护,同时提供了清晰的接口供外部代码使用。

1. 应用场景

  1. 模块化设计
  • 数据抽象有助于实现模块化设计,即将复杂的系统分解为多个独立的模块。每个模块都封装了自己的数据和操作,通过接口与其他模块交互。这提高了系统的可维护性和可扩展性。
  1. 信息隐藏
  • 通过将数据封装在类的私有部分中,并仅通过公共接口提供访问和操作这些数据的方法,数据抽象实现了信息隐藏。这有助于保护数据不被外部代码随意修改,从而提高了程序的安全性。
  1. 代码复用
  • 封装好的类可以被多个程序或模块重用,减少了重复编码的需要。这提高了开发效率,并有助于保持代码的一致性。
  1. 接口与实现分离
  • 数据抽象强调接口与实现的分离。外部代码只需关心类的接口(即公共成员函数),而无需了解类的内部实现细节。这有助于降低系统各部分之间的耦合度,提高系统的灵活性和可维护性。

1. 案例

C++中的数据抽象通过类来实现,将数据和操作这些数据的方法封装在一起,提供清晰的接口供外部使用。以下是一些C++数据抽象的应用场景及相应的案例代码。

银行账户管理

案例代码

#include <iostream>
#include <stdexcept> // 用于抛出异常

class BankAccount {
    
    
private:
    double balance; // 私有成员变量,存储账户余额

public:
    // 构造函数
    BankAccount(double initialBalance = 0.0) : balance(initialBalance) {
    
    }

    // 存款
    void deposit(double amount) {
    
    
        if (amount <= 0) {
    
    
            throw std::invalid_argument("Deposit amount must be positive");
        }
        balance += amount;
    }

    // 取款
    void withdraw(double amount) {
    
    
        if (amount <= 0 || amount > balance) {
    
    
            throw std::invalid_argument("Invalid withdrawal amount");
        }
        balance -= amount;
    }

    // 获取余额
    double getBalance() const {
    
    
        return balance;
    }
};

int main() {
    
    
    BankAccount account(100.0); // 创建一个账户,初始余额为100

    std::cout << "Initial balance: " << account.getBalance() << std::endl;

    try {
    
    
        account.withdraw(50.0); // 取款50
        std::cout << "Balance after withdrawal: " << account.getBalance() << std::endl;

        account.deposit(75.0); // 存款75
        std::cout << "Balance after deposit: " << account.getBalance() << std::endl;

        // 尝试无效取款
        account.withdraw(200.0);
    } catch (const std::invalid_argument& e) {
    
    
        std::cout << "Error: " << e.what() << std::endl;
    }

    return 0;
}

学生信息管理系统

在这个场景中,我们可能有一个Student类,用于表示学生信息,并包含获取和设置学生信息的方法。

案例代码(简化版):

#include <iostream>
#include <string>

class Student {
    
    
private:
    std::string name;
    int age;
    float gpa; // Grade Point Average

public:
    // 构造函数
    Student(std::string n, int a, float g) : name(n), age(a), gpa(g) {
    
    }

    // 获取姓名
    std::string getName() const {
    
    
        return name;
    }

    // 设置姓名
    void setName(std::string n) {
    
    
        name = n;
    }

    // 获取年龄
    int getAge() const {
    
    
        return age;
    }

    // 设置年龄
    void setAge(int a) {
    
    
        if (a < 0) {
    
    
            throw std::invalid_argument("Age cannot be negative");
        }
        age = a;
    }

    // 获取GPA
    float getGPA() const {
    
    
        return gpa;
    }

    // 设置GPA
    void setGPA(float g) {
    
    
        if (g < 0 || g > 4.0) {
    
    
            throw std::invalid_argument("GPA must be between 0.0 and 4.0");
        }
        gpa = g;
    }
};

int main() {
    
    
    Student student("Alice", 20, 3.5);

    std::cout << "Student Name: " << student.getName() << std::endl;
    std::cout << "Student Age: " << student.getAge() << std::endl;
    std::cout << "Student GPA: " << student.getGPA() << std::endl;

    try {
    
    
        student.setAge(-5); // 尝试设置无效年龄
    } catch (const std::invalid_argument& e) {
    
    
        std::cout << "Error setting age: " << e.what() << std::endl;
    }

    return 0;
}

在这里插入图片描述

三、相关链接

  1. Visual Studio Code下载地址
  2. Sublime Text下载地址
  3. 「C++系列」C++简介、应用领域
  4. 「C++系列」C++ 基本语法
  5. 「C++系列」C++ 数据类型
  6. 「C++系列」C++ 变量类型
  7. 「C++系列」C++ 变量作用域
  8. 「C++系列」C++ 常量知识点-细致讲解
  9. 「C++系列」C++ 修饰符类型
  10. 「C++系列」一篇文章说透【存储类】
  11. 「C++系列」一篇文章讲透【运算符】
  12. 「C++系列」循环
  13. 「C++系列」判断
  14. 「C++系列」函数/内置函数
  15. 「C++系列」数字/随机数
  16. 「C++系列」数组
  17. 「C++系列」字符串
  18. 「C++系列」指针
  19. 「C++系列」引用
  20. 「C++系列」日期/时间
  21. 「C++系列」输入/输出
  22. 「C++系列」数据结构
  23. 「C++系列」vector 容器
  24. 「C++系列」类/对象
  25. 「C++系列」继承
  26. 「C++系列」重载运算符/重载函数
  27. 「C++系列」多态

猜你喜欢

转载自blog.csdn.net/xuaner8786/article/details/141934573