类与对象-封装
一、封装的意义
封装是C++面向对象三大特性之一
语法:
class name
{
访问权限:属性行为
};注意:类中的属性和行为 统称为成员
属性 又称 成员属性 / 成员变量
行为 又称 成员函数 / 成员方法
封装将属性和行为作为一个整体,表现生活中的事物
例①:接下来创建一个圆类,以计算圆的周长
创建圆类:
// 创建一个 圆 类,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;
}将属性和行为加以权限控制
类在设计时,可以把属性和行为放在不同的权限下,加以控制
访问权限有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;
}
三、成员属性设置为私有
作用:
可以自己控制成员的读写权限
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;
}

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

对于写可以检测数据的有效性
在上面类中,我们在查看年龄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,则报错,满足才修改年龄
四、两道例题
设计一个正方体类,获取正方体长宽高,计算出正方体面积和体积,并分别用全局函数和成员函数判断两个立方体是否相等
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面向对象三大特性之一语法: class name { 访问权限:属性行为 };注意:类中的属性和行为 统称为成员属性 又称 成员属性 / 成员变量行为 又称 成员函数 / 成员方法封装将属性和行为作为一个整体,表现生活中的事物例①&…...
【回忆杀】2012年拥有第一台电脑【致逝去的青春】
高中说起 在2012年的时候吧,高考过后,那个时候一门心思的想当一名体育老师【现在居然还有这个想法,哈哈】,最后没有考上自己希望的大学我记得好像是2012年7月的时候就去重庆投靠朋友,他教我做模具,2012年做…...
PointNeXt: Revisiting PointNet++ with Improved Training and Scaling Strategies
Abstract PointNet 是点云理解领域最有影响力的神经网络架构之一。虽然近期出现了 PointMLP 和 Point Transformer 等新型网络,它们的精度已经大大超过了 PointNet,但我们发现大部分性能提升是由于改进的训练策略,例如数据增强和优化技术以及…...
打印九九乘法表-课后程序(JavaScript前端开发案例教程-黑马程序员编著-第2章-课后作业)
【案例2-9】打印九九乘法表 一、案例描述 考核知识点 for双重循环 练习目标 掌握for循环应用。实现九九乘法表。 需求分析 九九乘法表相信大家一点也不陌生,之前见到的乘法表是印刷在课程本之上的。而在本案例中我们将用JavaScript代码来实现九九乘法表。 案例分…...
【Linux】基于阻塞队列的生产者消费者模型
🌠 作者:阿亮joy. 🎆专栏:《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉为何要使用…...
【华为OD机试 2023最新 】 真正的密码(C++)
文章目录 题目描述输入描述输出描述用例题目解析C++题目描述 在一行中输入一个字符串数组,如果其中一个字符串的所有以索引0开头的子串在数组中都有,那么这个字符串就是潜在密码, 在所有潜在密码中最长的是真正的密码,如果有多个长度相同的真正的密码,那么取字典序最大的…...
差分算法(蓝桥杯复习+例题讲解+模板c++)
文章目录差分介绍差分应用区间加区间求和总结3729. 改变数组元素100. 增减序列文章首发于:My Blog 欢迎大佬们前来逛逛 差分介绍 差分是一种常见的算法,用于快速修改数组中某一段区间的值。 差分的思想就是预处理出数组的差分数组,然后修改…...
CSS+ JS 实现手电筒效果
前言概述 JavaScript 结合 CSS 打造的一款图片特效,当鼠标拖拽滑块时,让本该置灰的图片局部恢复本来的颜色。且该效果随着你的鼠标的按下时的移动而移动。 核心功能 图片置灰 拖拽功能 让滑块位置处的图片恢复本来的颜色 实现原理 这个的实现原理并不…...
2021地理设计组二等奖:基于InSAR和指数分析的地面沉降风
作品简介 一、作品背景 地面沉降是指地面高程的降低, 又称地面下沉或地沉, 是以缓慢、难以察觉的向下垂直运动为主, 是指在自然和人为因素作用下, 由于地壳表层土体压缩而导致区域性地面标高降低的一种环境现象。目前, 地面沉降己成为城市化进程中普遍存在的生态环境问题, 成为…...
计算机操作系统(第四版)第二章进程的描述与控制—课后习题答案
1.什么是前趋图?为什么要引入前趋图? 前趋图是一个有向无循环图,记为DAG,用于描述进程之间执行的先后关系。 2.试画出下面四条语句的前趋图: S1:axy; S2:bz1; S3:ca-b; S4:wc1; 3.为什么程序并发执行会产生间断性特征&…...
CAN通信----电路图
CAN通信----基本原理 一、CAN总线网络连接 1.闭环总线网络----ISO11898 闭环总线网络高速、短距离,它的总线最大长度为 40m,通信速度最高为 1Mbps,总线的两端各要求有一个120 欧的电阻。 2.开环总线网络----ISO11519 开环总线网络低速、…...
Windows系统安装ElasticSearch(一)
一 ES介绍Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:分布式实时文件存储&#…...
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常见面试题 #{}和¥{}的区别是什么? 【#】:底层执行SQL使用PreparedStatement对象,预编译SQL,相对安全。入参使用占位符的方式。 【$】:底层执行SQL使用Statement对象,入参使用SQL拼接的…...
IDEA 热部署,修改代码不用重启项目
热部署指在修改项目代码的时候不重启服务器让修改生效。安装JRebel and XRebelFile->Settings,然后Plugins-> Marketplace,输入JRebel,安装如下插件——JRebel and XRebel ,重启idea激活JRebel and XRebel第一行输入网址&am…...
将 XLS 转换为 EXE:xlCompiler Crack
只需单击几下即可将Excel文件转换为应用程序 xl编译器无需编程即可将您的Excel电子表格转换为软件应用程序 将 XLS 转换为 EXE 将Excel文件转换为具有保护选项的应用程序。Excel 到 EXE 转换器为您提供了分发 Excel 模型的竞争优势和灵活性。将 Excel 的功能丰富的环境保存在应…...
【百面成神】spring基础12问,你能坚持到第几问
前 言 🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端 ☕专栏简介:java面试宝典,特点:全、精、深、简,力求每个核心知识点1分钟回答好。 dz…...
javaSE类和对象(下)
目录君1.封装2.访问限定符3.包的定义及使用4.static成员变量5.static成员方法6.代码块及其分类实例代码块静态代码块静态代码块与实例代码块的执行顺序static成员变量(类变量)初始化1.封装 面向对象程序三大特性:封装、继承、多态。而类和对象阶段,主要…...
【数据结构】第四站:单链表力扣题(二)
目录 一、链表的回文结构 二、相交链表 三、环形链表 四、环形链表Ⅱ 五、复制带随机指针的链表 一、链表的回文结构 题目描述:链表的回文结构_牛客题霸_牛客网 对于这道题,如果没有前面的一些题的基础,是非常难做的,我们的思…...
KafKa知识汇总
前言 汇总相关知识 Kafka快速实战与基本原理详解...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
