当前位置: 首页 > news >正文

类与对象-封装

一、封装的意义

封装是C++面向对象三大特性之一

语法:

class name
{
访问权限:属性行为
};

注意:类中的属性和行为 统称为成员

属性 又称 成员属性 / 成员变量

行为 又称 成员函数 / 成员方法

  1. 封装将属性和行为作为一个整体,表现生活中的事物


例①:接下来创建一个圆类,以计算圆的周长

创建圆类:

// 创建一个 圆 类,class后跟着的就是类的名称
class Circle
{// 访问权限
public:// 公共权限// 属性int r; // 半径// 行为double caculate_perimeter() // 计算圆的周长{return 2 * PI * r;}
};

主函数

实例化:通过类创建一个对象的过程
#define PI 3.14
int main()
{    //   实例化:通过类创建一个对象的过程Circle c; // 通过 圆 类创建具体的圆(对象) cin >> c.r; // 给 圆 对象 的属性赋值cout << "半径为" << c.r << "的圆的周长为" << c.caculate_perimeter() << endl;return 0;
}

例②:设计一个学生类,属性有姓名和学号,行为可以给学生姓名和学号赋值,而且可以显示学生姓名和学号
class student
{
public:// 属性:姓名 学号string s_name;int s_number;// 行为:给姓名与学号赋值/显示void show(){cout << "学生姓名为" << s_name << endl;cout << "学生学号为" << s_number;}// 赋值void assignment1() // 键盘输入{cout << "请输入姓名" << endl;cin >> s_name;cout << endl;cout << "请输入学号" << endl;cin >> s_number;}void assignment2(string name,int Studnet_number)// 直接传参{s_name = name;s_number = Studnet_number;}
};

对于给姓名和学号赋值,有2种方法

1是直接键盘cin

2是调用函数时直接传参

方法不同,调用函数时写法也不同

int main()
{student s1;s1.assignment1();   //1键盘cin输入s1.assignment2("joyce", 32054123); // 2直接传参s1.show();return 0;
}
  1. 将属性和行为加以权限控制

类在设计时,可以把属性和行为放在不同的权限下,加以控制

访问权限有3种:

名称

作用范围

不同点

public

公共权限

类内可以访问,类外可以访问

\

protected

保护权限

类内可以访问,类外不可以访问

继承关系中,子可以使用父的

private

私有权限

类内可以访问,类外不可以访问

继承关系中,子不能使用父的

例:

class person
{
public:string name;// 姓名,公共权限protected:string car;// 汽车,保护权限private:int password;// 密码,私有权限
};int main()
{person p;p.name = "joyce";// 只有公共权限在类外才可以访问p.car = "BMW";p.password = 131221;return 0;
}

不过,如果在类内定义一个公共权限的函数,以访问各个权限的属性,则

class person
{
public:string name;// 姓名,公共权限protected:string car;// 汽车,保护权限private:int password;// 密码,私有权限public: //类内定义的公共权限的函数void func(){string name = "nana";string car = "BMW";int password = 19931312;}
};

在main函数中调用func函数,则可以访问保护权限和私有权限的属性

    p.func();

不过若是将函数的权限从public改为protected或是private,则仍然无法访问

二、struct与class的区别

区别在于 默认的访问权限不同

名称

默认访问权限

struct

public

公共权限

class

private

私有权限

创建struct和class两个类型

struct P1
{int a;
};
class P2
{int a;
};

在main函数中创建变量并尝试访问

int main()
{P1 p1; // 结构体p1.a = 5;P2 p2; // 类p2.a = 5;return 0;
}

三、成员属性设置为私有

作用:

  1. 可以自己控制成员的读写权限

class My
{
public:void setname(string name)// 设置姓名{m_name = name;}string getname() // 返回姓名{return m_name;}int getage() // 返回年龄,无法修改{return age;}void setPassword(int password) // 修改密码,无法查看{m_Password = password;}
private:string m_name; // 设置为可读可写int age = 5; // 设置为只读int m_Password; // 设置为只写
};

接下来使用各个函数,修改或查看各个属性

int main()
{My m;m.setname("joyce"); // 设置姓名cout << m.getname() << endl; // 查看姓名cout << m.getage() << endl;// 查看年龄//m.age = 6; // 若想修改年龄,无法访问m.setPassword(3171321); // 修改密码,无法查看m.m_Password; return 0;
}

可读可写权限的姓名,可以修改或是查看

  1. 对于写可以检测数据的有效性

在上面类中,我们在查看年龄getage函数下,加上设置年龄setage函数

    void setage(int age) // 设置年龄,范围0-150{if (age < 0 || age>150){cout << "Input errot!" << endl;m_age = 0;return;}m_age = age;}

加以判断,若年龄不在0-150,则报错,满足才修改年龄

四、两道例题

  1. 设计一个正方体类,获取正方体长宽高,计算出正方体面积和体积,并分别用全局函数和成员函数判断两个立方体是否相等

class Cube
{
public:// 设置与获取长宽高void setCube(int L, int W, int H){m_L = L;m_W = W;m_H = H;}int getL(){return m_L;}int getW(){return m_W;}int getH(){return m_H;}// 获取正方体面积int calculateArea(){return 2 * (m_L * m_W + m_L * m_H + m_W * m_H);}// 获取正方体体积int calculateVolume(){return m_L * m_W * m_H;}//2、用成员函数判断2个Cube是否相等bool Judge2(Cube& cube){if (getH() == cube.getH() &&getL() == cube.getL() &&getW() == cube.getW())return true;return false;}
private:int m_L, m_W, m_H;
};// 1、用全局函数判断2个Cube是否相等
bool Judge1(Cube&cube1 ,Cube&cube2)
{if (cube1.getH() == cube2.getH() &&cube1.getL() == cube2.getL() &&cube1.getW() == cube2.getW())return true;return false;
}
int main()
{// 创建第一个CubeCube cube1;cube1.setCube(10,10,10);/*cout << "正方体面积为" << cube1.calculateArea() << endl;cout << "正方体体积为" << cube1.calculateVolume() << endl*/;// 创建第二个CubeCube cube2;cube2.setCube(10, 10, 10);bool ret1 = Judge1(cube1,cube2); // 全局变量调用的对比if (ret1)cout << "cube1和cube2相等" << endl;elsecout << "cube1和cube2不相等" << endl;bool ret2 = cube1.Judge2(cube2); // 成员函数调用的对比if (ret2)    cout << "cube1和cube2相等" << endl;elsecout << "cube1和cube2不相等" << endl;return 0;
}

两函数都相等

两函数都不相等

2.

相关文章:

类与对象-封装

一、封装的意义封装是C面向对象三大特性之一语法&#xff1a; class name { 访问权限:属性行为 };注意&#xff1a;类中的属性和行为 统称为成员属性 又称 成员属性 / 成员变量行为 又称 成员函数 / 成员方法封装将属性和行为作为一个整体&#xff0c;表现生活中的事物例①&…...

【回忆杀】2012年拥有第一台电脑【致逝去的青春】

高中说起 在2012年的时候吧&#xff0c;高考过后&#xff0c;那个时候一门心思的想当一名体育老师【现在居然还有这个想法&#xff0c;哈哈】&#xff0c;最后没有考上自己希望的大学我记得好像是2012年7月的时候就去重庆投靠朋友&#xff0c;他教我做模具&#xff0c;2012年做…...

PointNeXt: Revisiting PointNet++ with Improved Training and Scaling Strategies

Abstract PointNet 是点云理解领域最有影响力的神经网络架构之一。虽然近期出现了 PointMLP 和 Point Transformer 等新型网络&#xff0c;它们的精度已经大大超过了 PointNet&#xff0c;但我们发现大部分性能提升是由于改进的训练策略&#xff0c;例如数据增强和优化技术以及…...

打印九九乘法表-课后程序(JavaScript前端开发案例教程-黑马程序员编著-第2章-课后作业)

【案例2-9】打印九九乘法表 一、案例描述 考核知识点 for双重循环 练习目标 掌握for循环应用。实现九九乘法表。 需求分析 九九乘法表相信大家一点也不陌生&#xff0c;之前见到的乘法表是印刷在课程本之上的。而在本案例中我们将用JavaScript代码来实现九九乘法表。 案例分…...

【Linux】基于阻塞队列的生产者消费者模型

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;为何要使用…...

【华为OD机试 2023最新 】 真正的密码(C++)

文章目录 题目描述输入描述输出描述用例题目解析C++题目描述 在一行中输入一个字符串数组,如果其中一个字符串的所有以索引0开头的子串在数组中都有,那么这个字符串就是潜在密码, 在所有潜在密码中最长的是真正的密码,如果有多个长度相同的真正的密码,那么取字典序最大的…...

差分算法(蓝桥杯复习+例题讲解+模板c++)

文章目录差分介绍差分应用区间加区间求和总结3729. 改变数组元素100. 增减序列文章首发于&#xff1a;My Blog 欢迎大佬们前来逛逛 差分介绍 差分是一种常见的算法&#xff0c;用于快速修改数组中某一段区间的值。 差分的思想就是预处理出数组的差分数组&#xff0c;然后修改…...

CSS+ JS 实现手电筒效果

前言概述 JavaScript 结合 CSS 打造的一款图片特效&#xff0c;当鼠标拖拽滑块时&#xff0c;让本该置灰的图片局部恢复本来的颜色。且该效果随着你的鼠标的按下时的移动而移动。 核心功能 图片置灰 拖拽功能 让滑块位置处的图片恢复本来的颜色 实现原理 这个的实现原理并不…...

2021地理设计组二等奖:基于InSAR和指数分析的地面沉降风

作品简介 一、作品背景 地面沉降是指地面高程的降低, 又称地面下沉或地沉, 是以缓慢、难以察觉的向下垂直运动为主, 是指在自然和人为因素作用下, 由于地壳表层土体压缩而导致区域性地面标高降低的一种环境现象。目前, 地面沉降己成为城市化进程中普遍存在的生态环境问题, 成为…...

计算机操作系统(第四版)第二章进程的描述与控制—课后习题答案

1.什么是前趋图&#xff1f;为什么要引入前趋图&#xff1f; 前趋图是一个有向无循环图&#xff0c;记为DAG&#xff0c;用于描述进程之间执行的先后关系。 2.试画出下面四条语句的前趋图&#xff1a; S1:axy; S2:bz1; S3:ca-b; S4:wc1; 3.为什么程序并发执行会产生间断性特征&…...

CAN通信----电路图

CAN通信----基本原理 一、CAN总线网络连接 1.闭环总线网络----ISO11898 闭环总线网络高速、短距离&#xff0c;它的总线最大长度为 40m&#xff0c;通信速度最高为 1Mbps&#xff0c;总线的两端各要求有一个120 欧的电阻。 2.开环总线网络----ISO11519 开环总线网络低速、…...

Windows系统安装ElasticSearch(一)

一 ES介绍Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单&#xff0c;它不仅包括了全文搜索功能&#xff0c;还可以进行以下工作:分布式实时文件存储&#…...

linux 产生随机数 并遍历

1、产生随机数 varRANDOMvarRANDOM varRANDOMvar[ $var % 150 ] 2、产生不重复的随机数 $ entries($(shuf -i 0-149 -n 15)) $ echo “${entries[]}” 3、对随机数排序 $ entries($(shuf -i 0-149 -n 15 | sort -n)) $ echo “entries[]"12224549546678798393118119124140…...

【3.24】Mybatis常见面试题

Mybatis常见面试题 #{}和&#xffe5;{}的区别是什么&#xff1f; 【#】&#xff1a;底层执行SQL使用PreparedStatement对象&#xff0c;预编译SQL&#xff0c;相对安全。入参使用占位符的方式。 【$】&#xff1a;底层执行SQL使用Statement对象&#xff0c;入参使用SQL拼接的…...

IDEA 热部署,修改代码不用重启项目

热部署指在修改项目代码的时候不重启服务器让修改生效。安装JRebel and XRebelFile->Settings&#xff0c;然后Plugins-> Marketplace&#xff0c;输入JRebel&#xff0c;安装如下插件——JRebel and XRebel &#xff0c;重启idea激活JRebel and XRebel第一行输入网址&am…...

将 XLS 转换为 EXE:xlCompiler Crack

只需单击几下即可将Excel文件转换为应用程序 xl编译器无需编程即可将您的Excel电子表格转换为软件应用程序 将 XLS 转换为 EXE 将Excel文件转换为具有保护选项的应用程序。Excel 到 EXE 转换器为您提供了分发 Excel 模型的竞争优势和灵活性。将 Excel 的功能丰富的环境保存在应…...

【百面成神】spring基础12问,你能坚持到第几问

前 言 &#x1f349; 作者简介&#xff1a;半旧518&#xff0c;长跑型选手&#xff0c;立志坚持写10年博客&#xff0c;专注于java后端 ☕专栏简介&#xff1a;java面试宝典&#xff0c;特点&#xff1a;全、精、深、简&#xff0c;力求每个核心知识点1分钟回答好。 &#x1f3…...

javaSE类和对象(下)

目录君1.封装2.访问限定符3.包的定义及使用4.static成员变量5.static成员方法6.代码块及其分类实例代码块静态代码块静态代码块与实例代码块的执行顺序static成员变量(类变量)初始化1.封装 面向对象程序三大特性&#xff1a;封装、继承、多态。而类和对象阶段&#xff0c;主要…...

【数据结构】第四站:单链表力扣题(二)

目录 一、链表的回文结构 二、相交链表 三、环形链表 四、环形链表Ⅱ 五、复制带随机指针的链表 一、链表的回文结构 题目描述&#xff1a;链表的回文结构_牛客题霸_牛客网 对于这道题&#xff0c;如果没有前面的一些题的基础&#xff0c;是非常难做的&#xff0c;我们的思…...

KafKa知识汇总

前言 汇总相关知识 Kafka快速实战与基本原理详解...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...