7. 类的封装

news2024/12/25 9:05:14

一、类的封装

  1. 封装的含义:
    • 所有属性都是私有的,外部不能直接访问
    • 提供与属性相关的成员函数,间接访问属性

模板代码:

#include <iostream>
using namespace std;

class Clock {
private:
    int hour, minute, second;
public:
    Clock();							  // 声明无参构造函数,用缺省值初始化对象
    Clock(int newH, int newM, int newS);	// 声明有参构造函数,用传入的参数初始化对象
    
    // 内联函数,设置属性的值
    void setHour(int hour) {
        this->hour = hour;	// 将外部传入的值赋给属性
    }
    void setMinute(int minute) {
        this->minute = minute;
    }
    void setSecond(int second) {
        this->second = second;
    }
    // 获得属性的值
    int getHour() {
        return hour;
    }
    int getMinute() {
        return minute;
    }
    int getSecond() {
        return second;
    }
    
    void display() {
        cout << hour << ":" << minute << ":" << second << endl;
    }
};

// 定义无参构造函数,给hour、minute、second赋初值为1
Clock::Clock(): hour(1), minute(1), second(1) {  
}
/* 推荐写法:
Clock::Clock() {
    this->hour = 1;
    this->minute = 1;
    this->second = 1;
}
*/ 

// 定义有参构造函数,给hour、minute、second赋初值为传入的参数值
Clock::Clock(int newH, int newM, int newS): hour(newH), minute(newM), second(newS) { 
}
/* 推荐写法:
Clock::Clock(int newH, int newM, int newS) {
    this->hour = newH;		// 将传入的hour值赋给hour属性
    this->minute = newM;
    this->second = newS;
}
*/ 

int main() {
    
    Clock myClock1;		// 定义对象,此时自动调用无参构造函数
    cout << "利用无参构造函数创建的时间对象为:";
    myClock1.display();
    
    Clock myClock2(8, 3, 30);	// 定义对象,此时自动调用有参构造函数
    cout << "利用有参构造函数创建的时间对象为:";
    myClock2.display();
    
    myClock2.setHour(21);
    cout << "修改过的对象的时间为:";
    myClock2.display();    
    
    return 0;
}

二、数据域封装

2.1 数据封装的方法

  • 在定义私有数据域的类之外,对象不能通过直接引用访问该数据域

    // 这两种方式均错误
    myClock.hour = 5;
    hour = myClock.hour;
    
  • 为了能够访问私有数据域,可以编写一个成员函数返回数据值(如getHour,getMinute),为了能够修改它,可以编写一个成员函数(如setHour,setMinute)进行设置

    myClock.setHour(5);
    hour = myClock.getHour();
    

2.2 数据封装的优点

2.2.1 防止对封装数据的越权访问

  • 如果要隐藏studentID域,实现数据域的保护的方法有:
    • 用private声明这个数据
    • 不要定义getStudentID函数
class Student {
private:
    char studentID[20];
    char studentName[20];
    ......
}

2.2.2 限制私有特性改变时产生的连锁反应

  • 属性是私有的,不对外公开,必须要通过getAge函数去读取私有属性(age)的内容
  • 一个信息被隐藏的越好,未来可被修改的权利就更大
// 修改前的代码
class Student {
// 定义了age属性
private:
    int age;
public:
    int getAge(){
        return age;
    }
    ...
}

// 修改后的代码
// 把age属性替换成出生年、月、日
class Student {
private:
    int birthYear;
    int birthMonth;
    int birthDate;
public:
    int getAge(){
        age = 系统时间 - 出生年、月、日
        return age;
    }
    ...
}

// 调用代码
// 修改前后调用代码不需要改变
Student s;
int currentAge = s.getAge();
image-20220606210321109

2.2.3 保持数据的完整性

/* 
birthdate是私有属性
外界可以修改birthdate,但是数据的格式必须要符合要求,比如mm/dd/yyyy这种,因此可定义一个共有的检查函数updateBirthdate()
先对传过来的新修改的birthdate值进行格式检查,只有当格式符合要求的时候才可以调用私有成员函数setBirthdate()对birthdate进行修改
*/
class Student {
private:
    char birthdate[12];
    void setBirthdate(char d[]) {
        strcpy(birthdate, d);
    }
public:
    bool updateBirthdate(char d[]) {
        if(Data format is not mm/dd/yyyy)
            return false;
        else if(range of mm or dd is wrong)
            return false;
        else{
            setBirthdate(d);
            return true;
        }
    }
};
image-20220606211500694

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

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

相关文章

Linux之Jupyter NoteBook安装

一、Jupyter NoteBook简介 Jupyter Notebook&#xff08;此前被称为 IPython notebook&#xff09;是一个交互式笔记本&#xff0c;支持运行 40 多种编程语言。Jupyter Notebook 的本质是一个 Web 应用程序&#xff0c;便于创建和共享程序文档&#xff0c;支持实时代码&#xf…

10个可直接访问的AI工具

10个不同功能的AI工具 1、ChatGPT镜像&#xff1a;知汇 2、AI画图工具&#xff1a;Midjourney 3、AI图片背景移除工具&#xff1a;AI Background Remover – Remove Background From Image 4、AI图片无损放大工具&#xff1a;https://www.upscayl.org/ 5、AI老照片上色修复工具…

1459页54万字电力行业数字化转型监管云平台 解决方案(WORD)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 目录 1 总体要求 1.1 系统框架及结构 1.1.1 总体架构 1.1.2 主配网一体化架构 1.1.3 数据流架构 1.1.4 数据流架构 1.1.5 功能结构 1.1.6 硬件结构 1.2 总…

事务传播行为 @Transactional

文章目录 前言一、事务是什么&#xff1f;二、使用步骤开始验证1.验证REQUIRED2.验证 REQUIRES_NEW3.同一个类中的两个方法 总结 前言 事务传播行为: 指的是在项目中开启多个事务后,他们之间的影响关系; 一、事务是什么&#xff1f; 逻辑上是一组操作&#xff0c;要么执行&am…

ASEMI代理ADUM3223ARZ-RL7原装ADI车规级ADUM3223ARZ-RL7

编辑&#xff1a;ll ASEMI代理ADUM3223ARZ-RL7原装ADI车规级ADUM3223ARZ-RL7 型号&#xff1a;ADUM3223ARZ-RL7 品牌&#xff1a;ADI /亚德诺 封装&#xff1a;SOIC-16 批号&#xff1a;2023 安装类型&#xff1a;表面贴装型 引脚数量&#xff1a;16 工作温度:-40C~125…

form表单与模板引擎

文章目录 一、form表单的基本使用1、什么是表单2、表单的组成部分3、 <form>标签的属性4、表单的同步提交及缺点&#xff08;1&#xff09; 什么是表单的同步提交&#xff08;2&#xff09; 表单同步提交的缺点&#xff08;3&#xff09; 如何解决表单同步提交的缺点 二、…

Java中的位运算

文章目录 Java中支持的位运算位运算规则逻辑运算与运算&#xff08;&&#xff09;或运算&#xff08;|&#xff09;异或运算&#xff08;^&#xff09;取反运算&#xff08;~&#xff09; 位移操作左移&#xff08;<<&#xff09;右移&#xff08;>>&#xff0…

十五周算法训练营——BFS

今天是十五周算法训练营的第六周&#xff0c;主要讲BFS专题。&#xff08;欢迎加入十五周算法训练营&#xff0c;与小伙伴一起卷算法&#xff09; 「BFS的核心思想是把一些问题抽象成图&#xff0c;从一个点开始&#xff0c;向四周开始扩散。一般来说&#xff0c;写BFS算法都是…

3-Raven2百个靶机渗透(精写-思路为主)

特别注明&#xff1a;本文章只用于学习交流&#xff0c;不可用来从事违法犯罪活动&#xff0c;如使用者用来从事违法犯罪行为&#xff0c;一切与作者无关。 文章目录 前言一、信息收集二、ssh爆破尝试三、根据框架exp和cve拿shell四、对mysql的进一步渗透&#xff0c;mysql UD…

Python - 通过 pyInstaller 打包成可执行文件

一、场景 通常来说&#xff0c;我们开发的 python 脚本一般都会用到一些第三方的包&#xff0c;并且需要对应版本的 python 解释器。因此在 python 脚本在不同的主机上运行的时候相对来说不是很方便&#xff0c;为此可以通过 pyInstaller 将脚本和解释器打包成可执行文件&…

数字中国创新大赛·信创赛道优秀作品推荐 | 国产工业实时操作系统(Intewell)

产品介绍和功能体系 Intewell工业实时操作系统源于有30多年发展历史的“道”操作系统&#xff0c;是一款微内核实时操作系统&#xff08;RTOS&#xff09;&#xff0c;具有良好的可扩展性、友好的用户开发环境和丰富的开发调试工具&#xff0c;提供POSIX接口。Intewell工业实时…

2023年5月产品经理认证NPDP线上班,我要报名学习

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…

程序设计的三种结构-C中实现其的6条语句

什么是程序设计结构? C语言设计出来就是为了解决现实中存在的问题&#xff0c;但是现实中问题大多较为复杂&#xff0c;如何描述问题也成为了一个重要的问题。将这些众多的问题核心找出来&#xff0c;我们发现只需要使用三种基本的结构包括&#xff1a;顺序结构&#xff0c;分…

FS4068四节锂电池充电管理控制芯片

FS4068 是一款工作于 2.7V 到 6.5V 的 PFM 升压型四节锂电池充电控制集成电路。 FS4068采用恒流和恒压模式对电池进行充电管理&#xff0c;内部集成有基准电压源&#xff0c; 电感电流检测单元&#xff0c;电池电压检测电路和外置场效应晶体管驱动电路等&#xff0c; 具有外部元…

面向开发者的 ChatGPT 提示工程

LLM 正在逐步改变人们的生活&#xff0c;而对于开发者&#xff0c;如何基于 LLM 提供的 API 接口快速、便捷地开发一些具备更强能力、集成 LLM 的应用&#xff0c;来便捷地实现一些更新颖、更实用的能力&#xff0c;是一个急需学习的重要能力。由巨佬吴恩达老师与 OpenAI 合作推…

Golang每日一练(leetDay0060) 多数元素、两数之和III

目录 169. 多数元素 Majority Element &#x1f31f; 170. 两数之和 III Two-sum-iii-data-structure-design &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏…

Zynq实现SDI视频解码PCIE传输 提供工程源码和QT上位机源码加技术支持

目录 1、前言2、我已有的SDI编解码方案3、我已有的PCIE方案4、基于zynq架构的PCIE5、总体设计思路和方案SDI摄像头Gv8601a单端转差GTX解串SDI解码VGA时序恢复YUV转RGB图像缓存PCIE发送通路SDI同步输出通路 6、vivado工程详解7、驱动安装8、QT上位机软件9、上板调试验证SDI同步H…

VMware虚拟机克隆、复制虚拟机

文章目录 为什么要克隆一、环境检查二、开始克隆三、网卡静态配置 为什么要克隆 首先VMware 上创建的虚拟机是可以重复使用的&#xff0c;安装好的虚拟机可以直接复制或者剪切到其它任意电脑上&#xff0c;然后使用 VMware 打开使用&#xff0c;两者的虚拟机设置以及登录密码都…

MySQL笔记(二) 数据库操纵语言DML 、数据库查询语言DQL、数据库控制语言DCL、计算字段、子查询、函数

MySQL笔记&#xff08;二&#xff09; 数据库操纵语言 DML插入数据 INSERT修改数据 UPDATE删除数据 DELETE 数据库查询语言DQL单表查询常用查询条件排序查询分组和分页查询限制结果 分页查询多表查询自身连接查询外连接查询嵌套查询 计算字段字段 field拼接 concatenateTrim()…

10个免费的ChatGPT镜像网站

文章目录 前言说明网站 前言 ChatGPT是一种基于OpenAI GPT&#xff08;Generative Pretrained Transformer&#xff09;模型的聊天机器人&#xff0c;它可以对用户提出的问题做出回答&#xff0c;同时还能够进行精准的语言理解和回复&#xff0c;较好地满足了人们与机器人之间…