C++--数据抽象和数据封装

目录

1.数据抽象的概念

1.1访问标签的概念

1.2数据抽象的好处

2.数据封装

3.c++接口(抽象类)

3.1抽象类的定义

3.2 示例代码

3.3关键点总结


1.数据抽象的概念

数据抽象强调隐藏实现细节,只展示用户需要关注的信息。通过这种方式,用户可以专注于如何使用数据而不是如何实现这些数据。例如,操作一台电视机时,用户只需使用遥控器按钮,而不需要理解其内部电子电路如何工作。

1.1访问标签的概念

C++ 中的访问标签分为三种:

  1. public:公有成员可以被任何其他代码访问。这通常用于定义类的接口,允许用户与类进行交互。

  2. private:私有成员只能在类的内部访问。这是数据抽象的核心,防止外部代码直接修改对象的状态,从而避免意外错误。

  3. protected:受保护的成员可以被类及其派生类访问。这在继承时尤其有用,但对外部代码仍然是不可见的。

#include <iostream>

class BankAccount {
private:
    double balance; // 私有成员,隐藏实现细节

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

    // 公有方法,用于存款
    void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
        }
    }

    // 公有方法,用于取款
    void withdraw(double amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount;
        }
    }

    // 公有方法,用于查询余额
    double getBalance() const {
        return balance;
    }
};

int main() {
    BankAccount account(100.0);
    account.deposit(50.0);
    account.withdraw(30.0);
    
    std::cout << "Current Balance: " << account.getBalance() << std::endl; // 输出: Current Balance: 120

    // 直接访问 balance 会导致编译错误
    // std::cout << account.balance << std::endl; // 这一行将无法编译

    return 0;
}

1.2数据抽象的好处

  1. 保护类的内部状态

    通过将数据成员设为私有,类的内部实现不会受到外部代码的干扰。这防止了因不当访问导致的状态损坏。例如,用户无法直接修改 balance,必须通过 deposit() 和 withdraw() 方法来操作。
  2. 实现的灵活性

    当实现需求变化时(如需要更改余额计算的逻辑),只需在类的内部进行修改,而不影响使用该类的外部代码。只要公共接口保持不变,外部代码无需任何修改。例如,如果需要记录交易历史,可以在 deposit() 和 withdraw() 方法中添加新的功能,而无需改变外部代码如何与 BankAccount 交互。

2.数据封装

数据封装是面向对象编程(OOP)的核心原则之一,它涉及将数据(成员变量)和对数据进行操作的函数(成员函数)捆绑在一起。封装的主要目的包括:

安全性:通过控制对数据的访问,防止外部代码直接修改内部状态,从而减少潜在的错误和不一致性。

模块化:将数据和操作逻辑组合成一个单独的模块,便于管理和维护。

易用性:提供清晰的接口,使用户能够轻松使用类的功能,而无需了解内部实现。

3.c++接口(抽象类)

3.1抽象类的定义

抽象类是包含至少一个纯虚函数的类。纯虚函数是通过在函数声明后添加 = 0 来指定的。由于存在纯虚函数,抽象类无法被实例化,只能作为基类使用。

3.2 示例代码

#include <iostream>

// 定义一个抽象类
class Shape {
public:
    // 纯虚函数,描述计算面积的接口
    virtual double area() const = 0; 

    // 纯虚函数,描述计算周长的接口
    virtual double perimeter() const = 0; 

    // 虚析构函数,确保派生类的析构函数被调用
    virtual ~Shape() {}
};

// 具体类,继承自抽象类
class Rectangle : public Shape {
private:
    double width, height;

public:
    Rectangle(double w, double h) : width(w), height(h) {}

    // 实现纯虚函数
    double area() const override {
        return width * height;
    }

    double perimeter() const override {
        return 2 * (width + height);
    }
};

// 另一个具体类,继承自抽象类
class Circle : public Shape {
private:
    double radius;

public:
    Circle(double r) : radius(r) {}

    // 实现纯虚函数
    double area() const override {
        return 3.14159 * radius * radius;
    }

    double perimeter() const override {
        return 2 * 3.14159 * radius;
    }
};

int main() {
    // 无法实例化 Shape 类
    // Shape shape; // 编译错误

    // 使用具体类
    Shape* rect = new Rectangle(10.0, 5.0);
    Shape* circ = new Circle(3.0);

    std::cout << "Rectangle area: " << rect->area() << std::endl;
    std::cout << "Circle area: " << circ->area() << std::endl;

    delete rect;
    delete circ;

    return 0;
}

3.3关键点总结

  1. 纯虚函数:通过 = 0 定义,表示该函数没有实现,必须在派生类中实现。
  2. 抽象类:包含至少一个纯虚函数的类,不能实例化。
  3. 具体类:继承自抽象类并实现所有纯虚函数的类,可以被实例化。
  4. 多态性:使用基类指针可以指向任何派生类对象,实现动态绑定。

这种结构允许代码遵循开闭原则,易于扩展和维护,使得新类型的形状可以轻松地添加,而不需要修改已有代码。

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

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

相关文章

JAVA Maven 的安装与配置

一、下载地址 官方网站&#xff1a;Maven – Download Apache Maven 我这里是3.8.6版本 二、安装步骤 maven安装之前要先安装jdk&#xff0c;请确保你的系统已经安装了jdk环境。 1.将下载好的 Maven 进行解压 apache-maven-3.6.8-bin.zip 2.配置本地仓库:修改 conf/settin…

C++设计模式创建型模式———单例模式

文章目录 一、引言二、懒汉模式三、饿汉模式四、C11 的线程安全单例五、与其他模式的关系六、总结 一、引言 单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 在一个项目中&#xff0c;全局范围内&a…

HTML+CSS实现超酷超炫的3D立方体相册

效果演示 HTML和CSS实现一个简单的3D立方体加载动画的相册。它使用了HTML来构建立方体的结构&#xff0c;并通过CSS来添加样式和动画效果。 HTML <div class"loader3d"><div class"cube"><div class"face"><img src&qu…

如何对pdf文件进行加密?pdf文件加密全攻略与深度解析(5个方法)

如何对pdf文件进行加密&#xff1f; 只见&#xff0c;在深夜的情报局里&#xff0c;特工小李将一份绝密PDF文件放在保险箱内&#xff0c;以为这样就天衣无缝了。 细细推敲&#xff0c;漏洞百出&#xff1a; 如果钥匙被盗呢&#xff1f;如果被神匠破解出密码呢&#xff1f;如果…

java 提示 避免用Apache Beanutils进行属性的copy。

避免用Apache Beanutils进行属性的copy。 Inspection info: 避免用Apache Beanutils进行属性的copy。 说明&#xff1a;Apache BeanUtils性能较差&#xff0c;可以使用其他方案比如Spring BeanUtils, Cglib BeanCopier。 TestObject a new TestObject(); TestObject b new Te…

linux指令笔记

bash命令行讲解 lyt &#xff1a;是用户名 iZbp1i65rwtrfbmjetete2b2Z :这个是主机名 ~ &#xff1a;这个是当前目录 $ &#xff1a;这个是命令行提示符 每个指令都有不同的功能&#xff0c;大部分指令都可以带上选项来实现不同的效果。 一般指令和选项的格式&#xff1a;…

【openEuler/Centos】yum安装软件报Error: GPG check FAILED【分析根因弄明白,亲测有效不浪费时间】

yum安装软件报Error: GPG check FAILED 环境信息&#xff1a;cat /etc/openEuler-release openEuler release 22.03 (LTS-SP1) 报错信息 The downloaded packages were saved in cache until the next successful transaction. You can remove cached packages by executin…

当我们在微服务中使用API网关时,它是否会成为系统的瓶颈?这种潜在的瓶颈如何评估和解决?如何在微服务架构中保证高效请求流量?|API网关|微服务|异步处理

目录 1. API网关在微服务中的角色与重要性 2. API网关瓶颈的评估 2.1 请求延迟分析 2.2 并发请求量监控 2.3 内存和CPU使用情况 2.4 限流和熔断机制评估 2.5 日志分析 3. API网关瓶颈的解决方案 3.1 缓存机制优化 3.2 负载均衡优化 3.3 异步处理与消息队列 3.4 限流…

记录如何在RK3588板子上跑通paddle的OCR模型

官网文档地址 rknn_zoo RKNPU2_SDK RKNN Model Zoo 一、PC电脑是Ubuntu22.04系统中完成环境搭建(板子是20.04&#xff09; 安装模型转换环境 ​conda create -n rknn2 python3.10 conda activate rknn2 安装Ubuntu依赖包 su…

STM32 第18章 SysTick--系统定时器

时间:2024.10.26-10.27 参考资料: 《零死角玩转STM32》“SysTick--系统定时器”章节 一、学习内容 1.SysTick简介 1.1 SysTick: 系统定时器,24位,只能递减,存在于内核,嵌套在NVIC中,所有的Cortex-M内核的单片机都具有这个定时器。 官方参考手册里的介绍: 系统嘀…

riscv uboot 启动流程分析 - SPL启动流程

分析uboot 启动流程硬件&#xff1a;启明智显推出M4核心板 &#xff08;https://gitee.com/qiming-zhixian/m4-openwrt&#xff09; 1.U-boot和SPL概述 U-Boot 分为 uboot-spl 和 uboot 两个组成部分。SPL 是 Secondary Program Loader 的简称&#xff0c;第二阶段程序加载器。…

重塑在线软件开发新纪元:集成高效安全特性,深度解析与评估会员与促销管理系统的系统架构设计

案例 阅读以下关于软件架构设计与评估的叙述&#xff0c;回答问题1和问题2。 【题目】 某电子商务公司拟升级其会员与促销管理系统&#xff0c;向用户提供个性化服务&#xff0c;提高用户的粘性。在项目立项之初&#xff0c;公司领导层一致认为本次升级的主要目标是提升会员管…

简单的udp程序

文章目录 1. 预备知识1.1 源IP地址和目的IP地址1.2 端口号1.3 套接字初识1.4 tcp协议和udp协议简单认识1.5 网络字节序 2. udp程序2.1 创建套接字&#xff08;socket&#xff09;的系统调用2.2 bind()2.2.1 初始化一个sockaddr_in结构体2.2.2 inet_addr函数2.2.3 0.0.0.02.2.4 …

深入解析东芝TB62261FTG,步进电机驱动方案

TB62261FTG是一款由东芝推出的两相双极步进电机驱动器&#xff0c;采用了BiCD工艺&#xff0c;能够提供高效的电机控制。这款芯片具有多种优秀的功能&#xff0c;包括PWM斩波、内置电流调节、低导通电阻的MOSFET以及多种步进操作模式&#xff0c;使其非常适合用于需要精确运动控…

一步一步从微信小程序获取asp.net Core API的数据

前面我们说过&#xff0c;如何使用微信小程序获取asp.net的数据&#xff0c;这里我们继续介绍如何获取asp.net core api的数据。两者之间还是有一些差别的。本篇博文旨在详细介绍如何一步一步从微信小程序获取asp.net Core API的数据。 文章目录 一、建立并了解asp.net core we…

RabbitMQ集群搭建及使用

1. 概述 前提条件&#xff1a;linux服务器下已经安装好了docker服务。 本文档将搭建一个三台RabbitMQ的集群&#xff0c;包括三个RabbitMQ容器安装在同一服务器和三台不同的服务器。 2. 集群搭建 在一台服务器上创建三个RabbitMQ容器。 2.1.1. 创建容器 执行以下命令创建三…

合理利用IPIDEA代理IP,优化数据采集效率!

一、前言 在全球化与信息化交织的当代社会&#xff0c;数据已成为驱动商业智慧与技术革新的核心引擎。网络&#xff0c;作为信息汇聚与交流的枢纽&#xff0c;不仅是人们获取知识的窗口&#xff0c;更是商业活动与技术创新的广阔舞台。在这个信息繁荣的时代&#xff0c;Python…

Docker 实践与应用举例教程:从入门到精通

Docker 实践与应用举例教程&#xff1a;从入门到精通 引言 在现代软件开发中&#xff0c;Docker 已成为一种不可或缺的工具。它通过容器化技术简化了应用的部署、管理和扩展&#xff0c;极大地提高了开发和运维的效率。本文将详细介绍 Docker 的基本概念、安装步骤、常用命令…

开放式耳机哪个品牌音质好?音质最好的开放式耳机推荐!

如今&#xff0c;开放式耳机市场日益繁荣&#xff0c;成为了众多音乐爱好者和追求舒适佩戴体验者的新宠。然而&#xff0c;面对琳琅满目的品牌和产品&#xff0c;消费者往往陷入选择的困境。音质&#xff0c;作为衡量一款耳机优劣的关键因素&#xff0c;更是备受关注。究竟哪个…

反编译华为-研究功耗联网监控日志

摘要 待机功耗中联网目前已知的盲点&#xff1a;App自己都不知道的push类型的被动联网、app下载场景所需时长、组播联网、路由器打醒AP。 竞品 策略 华为 灭屏使用handler定时检测&#xff08;若灭屏30分钟内则周期1分钟&#xff0c;否则为2分钟&#xff09;&#xff0c;检…