C++封装

1. 封装

1.1. struct

当单一变量无法完成描述需求的时候,结构体类型解决了这一问题。可以将多个类型打包成一体,形成新的类型,这是c语言中的封装
但是,新类型并不包含,对数据类的操作。所有操作都是通过函数的方式进行封装的
struct Date

// c语言的封装 数据放到  一起用struct打包,然后把数据以引用或指针的方式传给行为
// c++认为c语言封装不彻底
// 数据和行为分离,没有权限控制    对内数据开放,逻辑抽象,对外提供接口
struct Date
{int year;int month;int day;
};
void init(Date &d)
{cin >> d.year >> d.month >> d.day;
}
void print(Date &d)
{cout << d.year << " " << d.month << " " << d.day << endl;
}
bool isLeapYear(Date &d)
{if (d.year % 4 == 0 || d.year % 400 == 0 && d.year % 100 != 0)return true;elsereturn false;
}int main()
{Date d;init(d);print(d);if (isLeapYear(d))cout << d.year << " is leap year" << endl;elsecout << d.year << " is not leap year" << endl;return 0;
}

1.2. 封装

封装,可以实现对外提供接口,屏蔽数据,对内开放数据
比如:用struct封装的类,既知其接口,又可以直接访问其内部数据,这样却没有达到信息隐蔽的功效,而class则提供了这样的功能,屏蔽内部数据,对外开放接口
struct中所有行为和属性都是public的(默认),c++中class可以指定行为和属性的访问方式,默认为private
在这里插入图片描述

1.3. 用class封装带行为的类

class封装的本质,在于将数据和行为,绑定在一起通过对象来完成操作
class Date

// 权限控制 private protected public
// 数据和行为在一起
// 对内开放数据,逻辑抽象,对外提供接口
// 类 类对象 对象,调用行为完成需求
class Date
{
public:void init(){cin >> year >> month >> day;}void print(){cout << "year:" << "month:" << "day" << endl;cout << year << month << day << endl;}bool isLeapYear(){if (year % 4 == 0 || year % 400 == 0 && year % 100 != 0)return true;elsereturn false;}int getYear(){return year;}protected:int year;private:int month;int day;
};
int main()
{Date d;// d.year = 3000; // privated.init();d.print();if (d.isLeapYear())cout << d.getYear() << " is leap year" << endl;elsecout << d.getYear() << " is not leap year" << endl;return 0;
}

Date类访问自己的成员,可以不需要通过传引用的方式

class Date
{
public:void init(); // 函数成员void print();bool isLeapYear();int getYear();protected:int year;private:int month; // 数据成员int day;
};
void Date::init()
{cin >> year >> month >> day;
}
void Date::print()
{cout << "year:" << "month:" << "day" << endl;cout << year << month << day << endl;
}
bool Date::isLeapYear()
{if (year % 4 == 0 || year % 400 == 0 && year % 100 != 0)return true;elsereturn false;
}
int Date::getYear()
{return year;
}
int main()
{Date d;// d.year = 3000; // privated.init();d.print();if (d.isLeapYear())cout << d.getYear() << " is leap year" << endl;elsecout << d.getYear() << " is not leap year" << endl;return 0;
}

date.h

#ifndef DATE_H
#define DATE_H// 类名其实也是一种变相的命名空间
namespace Space
{class Date{public:void init(); // 函数成员void print();bool isLeapYear();int getYear();protected:int year;private:int month; // 数据成员int day;};
}#endif

date.cpp

#include "date.h"
#include <iostream>using namespace std;
namespace Space
{void Date::init(){cin >> year >> month >> day;}void Date::print(){cout << "year:" << "month:" << "day" << endl;cout << year << month << day << endl;}bool Date::isLeapYear(){if (year % 4 == 0 || year % 400 == 0 && year % 100 != 0)return true;elsereturn false;}int Date::getYear(){return year;}
}

main.cpp

// 声明和实现要分开
#include "date.h"
using namespace Space;int main()
{Date d;// d.year = 3000; // privated.init();d.print();if (d.isLeapYear())cout << d.getYear() << " is leap year" << endl;elsecout << d.getYear() << " is not leap year" << endl;return 0;
}

2. 练习封装

2.1. 封装自己的list

main.cpp


class List
{
public:List *createList();void insertList(int d);void traverseList();private:struct Node{int data;struct Node *next;} *head;
};List *List::createList()
{head = new Node;head->next = NULL;return this;
}
void List::insertList(int d)
{Node *cur = new Node;cur->data = d;cur->next = head->next;head->next = cur;
}
void List::traverseList()
{Node *ph = head->next;while (ph != NULL){cout << ph->data << endl;ph = ph->next;}
}int main()
{List list;list.createList();for (int i = 0; i < 10; i++){list.insertList(i);}list.traverseList();return 0;
}

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

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

相关文章

【C++】——【 STL简介】——【详细讲解】

目录 ​编辑 1. 什么是STL 2. STL的版本 3. STL的六大组件 1.容器(Container)&#xff1a; 2.算法(Algorithm)&#xff1a; 3.迭代器(Iterator)&#xff1a; 4.函数(Function)&#xff1a; 5.适配器(Adapter)&#xff1a; 6.分配器(Allocator)&#xff1a; 4. STL的…

调度器APScheduler定时执行任务

APScheduler&#xff08;Advanced Python Scheduler&#xff09;是一个Python库&#xff0c;用于调度任务&#xff0c;使其在预定的时间间隔或特定时间点执行。它支持多种调度方式&#xff0c;包括定时&#xff08;interval&#xff09;、日期&#xff08;date&#xff09;和Cr…

探索IT世界的第一步:高考后的暑期学习指南

目录 前言1. IT领域概述1.1 IT领域的发展与现状1.2 IT领域的主要分支1.2.1 软件开发1.2.2 数据科学1.2.3 网络与安全1.2.4 系统与运维 2. 学习路线图2.1 基础知识的学习2.1.1 编程语言2.1.2 数据结构与算法 2.2 实战项目的实践2.2.1 个人项目2.2.2 团队项目 2.3 学习资源的利用…

综合项目实战--jenkins流水线

一、流水线定义 软件生产环节,如:需求调研、需求设计、概要设计、详细设计、编码、单元测试、集成测试、系统测试、用户验收测试、交付等,这些流程就组成一条完整的流水线。脚本式流水线(pipeline)的出现代表企业人员可以更自由的通过代码来实现不同的工作流程。 二、pi…

气膜建筑照明:吊式与落地灯杆的利弊—轻空间

气膜建筑以其独特的设计和高效的功能性&#xff0c;广泛应用于体育场馆、工厂等各类场所。在这些气膜建筑中&#xff0c;照明方式的选择尤为重要。尽管有多种照明方式可供选择&#xff0c;但常用的反射光源形式在气膜建筑中尤为普遍。轻空间将重点介绍两种常用的反射照明方式&a…

Node端使用工作线程来解决日志开销-处理IO密集型任务

我们的BBF层很多时候会作为中间层处理后端到前端的数据&#xff0c;当然大部分时候都只是作为请求 / 响应的数据组装中心&#xff0c;但是有一个插件是怎么都绕不过去的&#xff1a;Log4js。 内部我们在Node层打印了很多日志。结果这周仔细分析了一下服务器处理请求到响应的中间…

音乐:触动心灵的艺术语言

Enjoy your music 音 乐 作为一种跨越时空和文化的艺术形式&#xff0c;拥有着无穷的魅力和力量。 它不仅能够带给我们愉悦的听觉享受&#xff0c;还对我们的身心健康、认知发展和社会交往产生着深远的影响。 一、音乐的基本元素 音乐由多个基本元素构成&#xff0c;包括…

【CentOS7.6】yum 报错:Could not retrieve mirrorlist http://mirrorlist.centos.org

一、报错 1.报错内容如下 在使用 yum makecache 命令时报错&#xff0c;在 yum install -y xxx 的时候报错等等 [roothcss-ecs-a901 yum.repos.d]# yum makecache Loaded plugins: fastestmirror Determining fastest mirrors Could not retrieve mirrorlist http://mirrorl…

【web APIs】快速上手Day03

目录 Web APIs - 第3天全选文本框案例事件流事件捕获事件冒泡阻止冒泡解绑事件on事件方式解绑addEventListener方式解绑 注意事项-鼠标经过事件的区别两种注册事件的区别 事件委托综合案例-tab栏切换改造 其他事件页面加载事件元素滚动事件页面滚动事件-获取位置页面滚动事件-滚…

巴西东南湾乌巴图巴 ANTARES 监测站数据

ANTARES monitoring station in Ubatuba, Southeast Brazilian Bight 巴西东南湾乌巴图巴 ANTARES 监测站 简介 ANTARES 区域网络由分布在拉丁美洲的沿岸时间序列站组成。主要目的是研究气候和人为影响引起的长期变化&#xff0c;以及用于卫星匹配和算法开发的海洋颜色。Uba…

SoftCLT: 时间序列的软对比学习《Soft Contrastive Learning for Time Series》(时间序列、时序分类任务、软...

2024年6月25日&#xff0c;10:11&#xff0c;好几天没看论文了&#xff0c;一直在摸鱼写代码(虽然也没学会多少)&#xff0c;今天看一篇师兄推荐的。 论文&#xff1a; Soft Contrastive Learning for Time Series 或者是&#xff1a; Soft Contrastive Learning for Time Seri…

[C++][设计模式][组合模式]详细讲解

目录 1.动机(Motivation)2.模式定义3.要点总结4.代码感受 1.动机(Motivation) 软件在某些情况下&#xff0c;客户代码过多地依赖于对象容器复杂的内部实现结构&#xff0c;对象容器内部实现结构(而非抽象结构)的变化引起客户代码的频繁变化&#xff0c;带来了代码的维护性、扩…

【Android面试八股文】什么是ANR?如何分析和定位ANR?如何避免ANR?

文章目录 一、ANR概述二、触发ANR的主要场景三、Android四大组件中的潜在的ANR风险五、避免ANR的实践建议六、ANR的产生原因与出现的场景6.1 原因:6.2 出现场景:七、ANR的定位与分析7.1. ANR分析思路——traces7.2 ANR其他分析思路与相关日志7.2.1 分析logcat思路7.2.2 分析k…

如何避免爬取网站时IP被封?

互联网协议 (IP) 地址是识别网络抓取工具的最常见方式。IP 是每个互联网交换的核心&#xff0c;对其进行跟踪和分析可以了解很多有关连接客户端的信息。 在网络抓取中&#xff0c;IP 跟踪和分析&#xff08;又名指纹&#xff09;通常用于限制和阻止网络抓取程序或其他不需要的访…

计算两个经纬度之间的球面距离(基于Mysql和PHP实现)

计算两个经纬度之间的球面距离 1、MySQL实现方式 - 基于空间函数(ST_Distance_Sphere)实现 前置条件&#xff1a;确保您使用的是 MySQL 8.0 或更高版本&#xff0c;因为较早的版本对地理空间的支持有限。 1.1 创建表和索引 说明&#xff1a;设置 location 为 point 类型 #…

【Python数据分析及环境搭建】:教程详解1(第23天)

系列文章目录 Python进行数据分析的优势常用Python数据分析开源库介绍启动Jupyter服务Jupyter Notebook的使用 文章目录 系列文章目录前言学习目标1. Python进行数据分析的优势2. 常用Python数据分析开源库介绍2.1 NumPy2.2 Pandas2.3 Matplotlib2.4 Seaborn2.5 Sklearn2.6 Ju…

第一 二章 小车硬件介绍-(全网最详细)基于STM32智能小车-蓝牙遥控、避障、循迹、跟随、PID速度控制、视觉循迹、openmv与STM32通信、openmv图像处理、smt32f103c8t6

第一篇-STM32智能小车硬件介绍 后续章节也放这里 持续更新中&#xff0c;视频发布在小B站 里面。这边也会更新。 B站视频合集: STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随 小B站链接:https://www.bilib…

启航IT世界:高考后假期的科技探索之旅

随着高考的落幕&#xff0c;新世界的大门已经为你们敞开。这个假期&#xff0c;不仅是放松身心的时光&#xff0c;更是为即将到来的IT学习之旅打下坚实基础的黄金时期。以下是一份专为你们准备的IT专业入门预习指南&#xff0c;希望能助你们一臂之力。 一&#xff1a;筑基篇&a…

Bootstrap 缩略图

Bootstrap 缩略图 引言 Bootstrap 是一个流行的前端框架,它提供了一套丰富的组件和工具,帮助开发者快速构建响应式和移动优先的网页。缩略图(Thumbnails)是 Bootstrap 中的一种组件,用于展示图片或其他媒体内容,通常与标题和文本描述一起使用,形成一个整洁的布局。本文…

【FPGA】Verilog:全减器与半减器 | Full Subtractor | Half Subtractor

0x00 全减器(Full Subtractor) 减法器是用于减法运算的逻辑电路,与不包含借位的半减法器不同。 全减法器因为包含借位的产生与否,所以具备完整的减法功能。 输出由差 和借位 组成: