[C++ 核心编程]笔记 4.1 封装

4.1.1 封装的意义

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


封装的意义:

  • 将属性和行为作为一个整体,表现生活中的事物
  • 将属性和行为加以权限控制

封装意义一:

  • 在设计类的时候,属性和行为写在一起,表现事物

语法:
class 类名{ 访问权限: 属性 /行为 };

实例1: 求圆的周长

#include<iostream>
using namespace std;//设计一个圆类, 求圆的周长const double PI = 3.14;//class 代表设计一个类, 
class Circle
{//访问权限//公共权限
public://属性//半径int m_r;//行为//获取圆的周长double calculateZC(){return 2 * PI * m_r;}
};int main()
{//通关圆类 创建具体的圆(对象)//实例化(通过一个类 创建一个对象的过程)Circle c1;c1.m_r = 10;cout << "圆的周长为:" << c1.calculateZC() << endl;system("pause");return 0;
}

输出:
在这里插入图片描述

实例2: 定义一个学生类, 输出姓名和学号

#include<iostream>
using namespace std;
#include<string>class Student
{public://公共权限//类中的属性和行为 我们统一称为 成员//属性	成员属性 成员变量//行为	成员函数 成员方法//属性string m_Name;//姓名int m_Id;//学号void showStudent(){cout << "姓名: " << m_Name << "\t学号" << m_Id << endl;}//给姓名赋值void setName(string name,int n){m_Name = name;m_Id = n;}
};int main()
{//实例化Student s1,s2;//给s1对象赋值s1.setName("张三",1);s2.m_Name = "李四";s2.m_Id = 2;//显示学生信息s1.showStudent();s2.showStudent();system("pause");return 0;
}

封装意义二:

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

访问权限有三种:

  1. public 公共权限
  2. protected 保护权限
  3. private 私有权限
#include<iostream>
using namespace std;//访问权限
//1. public 公共权限		成员类内可以访问	类外也可以访问
//2. protected 保护权限		成员类内可以访问	类外不可以访问
//3. private 私有权限		成员类内可以访问	类外不可以访问class Person
{//公共权限
public:string m_Name;  //姓名protected://保护权限string m_Car;private:int m_Password;//银行卡密码public:void func() {m_Name = "张三";m_Car = "拖拉机";m_Password = 123456;}
};int main()
{//实例化具体对象Person p1;p1.m_Name = "李四";p1.Car = "奔驰";//保护权限内容,类外无法访问p1.m_Password = 123;//私有权限内容, 类外无法访问 system("pause");return 0;
}

4.1.2 struct和class的区别

在C++中 struct和class唯一的区别就在于 默认的访问权限不同
区别:

  • struct 默认权限为公共
  • class 默认权限为私有
#include<iostream>
using namespace std;class C1
{int m_A;//默认私有
};
struct C2
{int m_A;//默认共有
};int main()
{//struct 默认权限为公共//class 默认权限为私有C1 c1;cl.m_A = 100;C2 c2;c2.m_A = 100;system("pause");return 0;
}

可以看到, 在类or结构体外:

  • c1报错, 无法访问, 是private权限
  • c2可以正常运行, 是public权限

在这里插入图片描述


4.1.3 成员属性设置为私有

优点1:将所有成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性

#include<iostream>
using namespace std;
/*4.1.3 成员属性设置为私有
优点1:将所有成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性*///人类
class Person
{
public://设置姓名void setName(string name){m_Name = name;}//获取姓名string getName(){return m_Name;}//获取年龄int getAge(){return m_Age;}//设置年龄(0-150)void setAge(int age){if (age < 0 || age>150){cout << "年龄"<<age<< " 输入有误, 赋值失败" << endl;return;}m_Age= age;}//设置偶像void setIdol(string idol){m_Idol = idol;}
private:string m_Name;//可读可写int m_Age =18;//只读		也可以写(年龄必须在0-150)string m_Idol;//只写
};int main()
{Person p;//姓名设置p.setName("张三");cout << "姓名: " << p.getName() << endl;//年龄设置p.setAge(160);//获取年龄cout << "年龄: " << p.getAge() << endl;//偶像设置p.setIdol("坤哥");//cout << "偶像: " << p.getIdol() << endl;//只写, 外界无法访问system("pause");return 0;
}

运行结果:
在这里插入图片描述

可以看到检测到年龄160不符合要求


4.1.4 类和对象 - 案例1:

设计立方体类(Cube)

  1. 求出立方体的面积和体积
  2. 分别用全局函数和成员函数判断两个立方体是否相等。

设计方法:

  1. 创建立方体类
  2. 设计属性
  3. 设计行为 求立方体面积和体积
  4. 分别用全局和成员函数 判断立方体是否相等
#include<iostream>
using namespace std;class Cube
{
public://设置长void setL(int l){m_L = l;}//获取长	int getL(){return m_L;}//设置宽void setW(int w){m_W = w;}//获取宽int getW(){return m_W;}//设置高void setH(int h){m_H = h;}//获取高int getH(){return m_H;}//获取立方体面积int calculateS(){return 2 * (m_L * m_W + m_L * m_H + m_W * m_H);}//获取立方体体积int calculateV(){return m_H * m_L * m_W;}//利用成员函数判断两个立方体是否相等bool isSameByClass(Cube &c){if (m_L == c.getL() && m_W == c.getW() && m_H == c.getH()){return true;}return false;}private://属性int m_L;int m_W;int m_H;
};//利用全局函数判断 两个立方体是否相等
bool isSame(Cube &c1, Cube &c2)
{if (c1.getH() == c2.getH() && c1.getL() == c2.getL() && c1.getW() == c2.getW())return true;return false;
}int main()
{Cube c1;c1.setL(10);c1.setH(10);c1.setW(10);cout << "c1的面积为: " << c1.calculateS() << endl;cout << "c1的体积为: " << c1.calculateV() << endl;//创建立方体c2Cube c2;c2.setL(10);c2.setH(10);c2.setW(10);cout << "c2的面积为: " << c2.calculateS() << endl;cout << "c2的体积为: " << c2.calculateV() << endl;//利用全局函数判断bool ret = isSame(c1, c2);//注意不要漏数据类型if (ret == true)cout << "立方体完全相等" << endl;elsecout << "立方体不完全相等" << endl;//利用成员函数判断ret = c1.isSameByClass(c2);if (ret == true)cout << "成员函数判断: 立方体完全相等" << endl;elsecout << "成员函数判断: 立方体不完全相等" << endl;system("pause");return 0;
}

运行结果如下:
在这里插入图片描述
设计完成


4.1.5 类和对象 - 案例2:

设计立方体类(Cube)

  1. 求出立方体的面积和体积
  2. 分别用全局函数和成员函数判断两个立方体是否相等。

设计方法:

  1. 创建立方体类
  2. 设计属性
  3. 设计行为 求立方体面积和体积
  4. 分别用全局和成员函数 判断立方体是否相等
#include<iostream>
using namespace std;class Cube
{
public://设置长void setL(int l){m_L = l;}//获取长	int getL(){return m_L;}//设置宽void setW(int w){m_W = w;}//获取宽int getW(){return m_W;}//设置高void setH(int h){m_H = h;}//获取高int getH(){return m_H;}//获取立方体面积int calculateS(){return 2 * (m_L * m_W + m_L * m_H + m_W * m_H);}//获取立方体体积int calculateV(){return m_H * m_L * m_W;}//利用成员函数判断两个立方体是否相等bool isSameByClass(Cube &c){if (m_L == c.getL() && m_W == c.getW() && m_H == c.getH()){return true;}return false;}private://属性int m_L;int m_W;int m_H;
};//利用全局函数判断 两个立方体是否相等
bool isSame(Cube &c1, Cube &c2)
{if (c1.getH() == c2.getH() && c1.getL() == c2.getL() && c1.getW() == c2.getW())return true;return false;
}int main()
{Cube c1;c1.setL(10);c1.setH(10);c1.setW(10);cout << "c1的面积为: " << c1.calculateS() << endl;cout << "c1的体积为: " << c1.calculateV() << endl;//创建立方体c2Cube c2;c2.setL(10);c2.setH(10);c2.setW(10);cout << "c2的面积为: " << c2.calculateS() << endl;cout << "c2的体积为: " << c2.calculateV() << endl;//利用全局函数判断bool ret = isSame(c1, c2);//注意不要漏数据类型if (ret == true)cout << "立方体完全相等" << endl;elsecout << "立方体不完全相等" << endl;//利用成员函数判断ret = c1.isSameByClass(c2);if (ret == true)cout << "成员函数判断: 立方体完全相等" << endl;elsecout << "成员函数判断: 立方体不完全相等" << endl;system("pause");return 0;
}

运行结果如下:
在这里插入图片描述
设计完成

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

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

相关文章

韩顺平 一周学会Linux | Linux 实操篇-组管理和权限管理

一、Linux 组 1. 组基本介绍 在linux 中的每个用户必须属于一个组&#xff0c;不能独立于组外。在linux 中每个文件有所有者、所在组、其它组的概念。 2. 文件/目录 所有者 一般为文件的创建者,谁创建了该文件&#xff0c;就自然的成为该文件的所有者。 1) 查看文件所有者&…

FBX福币交易所创业板指放量大涨2.73% 谷子经济概念持续爆发

查查配分析11月27日电 27日,A股三大指数探底回升,沪指涨逾1%,创业板指涨近3%。全市成交额较上个交易日放量至1.49万亿元。 截至收盘,上证指数涨1.53%,报3309.78点;深证成指涨2.25%,报10566.10点;创业板指涨2.73%,报2208.78点。 FBX福币凭借用户友好的界面和对透明度的承诺,迅速…

前端性能优化之任务管理/调度

浏览器的一帧 前面我们提到如何使用requestAnimationFrame来检测是否产生了卡顿。除此之外,如果你也处理过简单的异步任务管理(闲时执行等),还可以使用requestIdleCallback来检测卡顿。其实,requestAnimationFrame和requestIdleCallback都会在浏览器的每一帧中被执行到,…

Ubuntu20.04安装kalibr

文章目录 环境配置安装wxPython下载编译测试报错1问题描述问题分析问题解决 参考 环境配置 Ubuntu20.04&#xff0c;python3.8.10&#xff0c;boost自带的1.71 sudo apt update sudo apt-get install python3-setuptools python3-rosinstall ipython3 libeigen3-dev libboost…

QUAD-MxFE平台

QUAD-MxFE平台 16Tx/16Rx直接L/S/C频段采样相控阵/雷达/电子战/卫星通信开发平台 概览 优势和特点 四通道MxFE数字化处理卡 使用MxFE的多通道、宽带系统开发平台 与Xilinx VCU118评估板&#xff08;不包括&#xff09;搭配使用 16个RF接收(Rx)通道&#xff08;32个数字Rx通道…

互联网视频推拉流EasyDSS视频直播点播平台视频转码有哪些技术特点和应用?

视频转码本质上是一个先解码再编码的过程。在转码过程中&#xff0c;原始视频码流首先被解码成原始图像数据&#xff0c;然后再根据目标编码标准、分辨率、帧率、码率等参数重新进行编码。这样&#xff0c;转换前后的码流可能遵循相同的视频编码标准&#xff0c;也可能不遵循。…

开源加密库mbedtls及其Windows编译库

目录 1 项目简介 2 功能特性 3 性能优势 4 平台兼容性 5 应用场景 6 特点 7 Windows编译 8 编译静态库及其测试示例下载 1 项目简介 Mbed TLS是一个由ARM Maintained的开源项目&#xff0c;它提供了一个轻量级的加密库&#xff0c;适用于嵌入式系统和物联网设备。这个项…

GESP C++等级考试 二级真题(2024年9月)

若需要在线模拟考试&#xff0c;可进入题库中心&#xff0c;在线备考&#xff0c;检验掌握程度&#xff1a; https://www.hixinao.com/tidan/exam-157.html?time1732669362&sid172&index1

upload-labs 靶场(11~21)

免责声明 本博客文章仅供教育和研究目的使用。本文中提到的所有信息和技术均基于公开来源和合法获取的知识。本文不鼓励或支持任何非法活动&#xff0c;包括但不限于未经授权访问计算机系统、网络或数据。 作者对于读者使用本文中的信息所导致的任何直接或间接后果不承担任何…

嵌入式硬件实战基础篇(四)多路直流稳压电源

设计一个多路直流稳压电源 要求设计制作一个多路输出直流稳压电源,可将220 V / 5 0HZ交流电转换为5路直流稳压输出。具体要求&#xff1a; 输出直流电压 12V&#xff0c; 5V;和一路输出3- 15V连续可调直流稳压电源: 输出电流Iom500mA; 稳压系数 Sr≤0.05;

【人工智能】深入解析GPT、BERT与Transformer模型|从原理到应用的完整教程

在当今人工智能迅猛发展的时代&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域涌现出许多强大的模型&#xff0c;其中GPT、BERT与Transformer无疑是最受关注的三大巨头。这些模型不仅在学术界引起了广泛讨论&#xff0c;也在工业界得到了广泛应用。那么&#xff0c;G…

【计算机视觉+MATLAB】自动检测并可视化圆形目标:通过 imfindcircles 和 viscircles 函数

引言 自动检测图像中的圆形或圆形对象&#xff0c;并可视化检测到的圆形。 函数详解 imfindcircles imfindcircles是MATLAB中的一个函数&#xff0c;用于在图像中检测并找出圆形区域。 基本语法&#xff1a; [centers, radii] imfindcircles(A, radiusRange) [centers, r…

17. C++模板(template)1(泛型编程,函数模板,类模板)

⭐本篇重点&#xff1a;泛型编程&#xff0c;函数模板&#xff0c;类模板 ⭐本篇代码&#xff1a;c学习/07.函数模板 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) 目录 一. 泛型编程 二. 函数模板 2.1 函数模板的格式 2.2 函数模板的简单使用 2.3 函数模板…

学习threejs,设置envMap环境贴图创建反光效果

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.CubeTextureLoader 立…

v-for产生 You may have an infinite update loop in a component render function

参考文章&#xff1a; 报错解析 [Vue warn]: You may have an infinite update loop in a component render function. 另外一个解决方法 例如: MyList 是一个数组&#xff0c;我希望将排序后的结果返回进行for循环&#xff0c;因此设计了一个myMethon函数 <div v-for"…

spring boot框架漏洞复现

spring - java开源框架有五种 Spring MVC、SpringBoot、SpringFramework、SpringSecurity、SpringCloud spring boot版本 版本1: 直接就在根下 / 版本2:根下的必须目录 /actuator/ 端口:9093 spring boot搭建 1:直接下载源码打包 2:运行编译好的jar包:actuator-testb…

【Linux】线程的互斥和同步

【Linux】线程的互斥和同步 线程间的互斥 临界资源&#xff1a;多线程执行共享的资源就叫做临界资源临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区互斥&#xff1a;任何时刻&#xff0c;互斥保证有且只有一个执行流进入临界区&#…

集合Queue、Deque、LinkedList、ArrayDeque、PriorityQueue详解

1、 Queue与Deque的区别 在研究java集合源码的时候&#xff0c;发现了一个很少用但是很有趣的点&#xff1a;Queue以及Deque&#xff1b; 平常在写leetcode经常用LinkedList向上转型Deque作为栈或者队列使用&#xff0c;但是一直都不知道Queue的作用&#xff0c;于是就直接官方…

亮相全国集群智能与协同控制大会,卓翼飞思无人智能科研方案成焦点

无人集群智能协同技术是人工智能发展的必然趋势&#xff0c;也是我国新一代人工智能的核心研究领域。为加强集群智能与协同控制需求牵引和对接、技术交流和互动&#xff0c;11月23-25日&#xff0c;由中国指挥与控制学会主办的第八届全国集群智能与协同控制大会在贵阳市隆重召开…

Oracle JDK(通常简称为 JDK)和 OpenJDK区别

Java 的开发和运行时环境主要由两种实现主导&#xff1a;Oracle JDK&#xff08;通常简称为 JDK&#xff09;和 OpenJDK。尽管它们都基于同一个代码库&#xff0c;但在一些关键点上有所区别。以下是详细的对比&#xff1a; 1. 基础代码 Oracle JDK&#xff1a; 基于 OpenJD…