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

【C++】封装

1.封装的意义

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

实例化(通过一个类 创建一个对象的过程)

类中的属性和行为 我们统一称为 成员

属性 成员属性 成员变量

行为 成员函数 成员方法

封装的意义

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

                  2.将属性和行为加以权限控制 

封装意义一:在设计类的时候,属性和行为写在一起,表现事物

语法

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

示例1:设计一个圆类,求圆的周长

#include <iostream>
using namespace std;
#include<string>//圆周率
const double PI = 3.14;//设计一个圆类,求圆的周长
//圆求周长的公式:2* PI * 半径
//class 代表设计一个类,类后面紧跟着的就是类名称
class yuan 
{//访问权限 公共权限public://属性 半径int r;//行为 获取圆的周长double zhouchang(){return 2 * PI * r;}
};
int main()
{//通过圆类 创建具体的圆(对象)yuan c1;//给圆对象的属性进行赋值c1.r = 10;//2 * PI * rcout << "圆的周长为:" << c1.zhouchang() << 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 << "学号:" <<m_id << endl;}//给姓名赋值void setName(string name){m_name = name;}//给学号赋值void setID(int id){m_id = id;}
};
int main()
{//创建一个具体的学生 实例化对象student s1;//给s1对象 进行属性赋值操作s1.setName("祁同伟");s1.setID (10001);s1.showstudent();//显示学生信息system("pause");return 0;
}

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

访问权限有三种:1.public        公共权限

                             2.protected  保护权限

                             3.private      私有权限

#include <iostream>
using namespace std;
#include<string>
//三种权限
//公共权限  public     类内可以访问  类外可以访问
//保护权限  protected  类内可以访问  类外不可以访问
//私有权限  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 p;p.m_Name = "李四";//p.m_Car = "奔驰";//保护权限类外访问不到//p.m_Password = 123;//私有权限类外访问不到system("pause");return 0;
}

2. struct和class区别

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

区别:

        struct 默认权限为公共

        class  默认权限为私有

class C1
{int  m_A; //默认是私有权限
};struct C2
{int m_A;  //默认是公共权限
};int main() 
{C1 c1;c1.m_A = 10; //错误,访问权限是私有C2 c2;c2.m_A = 10; //正确,访问权限是公共system("pause");return 0;
}

3. 成员属性设置为私有

优点1:将所有成员属性设置为私有,可以自己控制读写权限

优点2:对于写权限,我们可以检测数据的有效性

#include <iostream>
using namespace std;
#include<string>
//成员属性设置私有
//1、可以自己控制读写权限
//2、对于写可以检测数据有效性
//人类
class Person
{
public://设置姓名void setName(string name){m_Name = name;}//获取姓名string getName(){return m_Name;}//获取年龄 只读 getint getAge(){return m_Age;}//设置年龄 只写 setvoid setAge(int age){if (age < 0 || age>100){cout << "年龄输入有误,赋值失败" << endl;return;}m_Age = age;}//设置偶像 只写 setvoid setIdol(string idol){m_Idol = idol;}private:string m_Name; //姓名 可读可写int m_Age = 18;  //年龄  只读string m_Idol;  //偶像  只写
};int main()
{Person p;//姓名设置p.setName("张三");//获取姓名cout << "姓名:" << p.getName() << endl;//年龄设置p.setAge(30); //获取年龄cout << "年龄:" << p.getAge() << endl;//偶像设置p.setIdol("迪丽热巴"); //只写//cout << "偶像:" << p.getIdoi() << endl;//只写状态 外界访问不到system("pause");return 0;
}

4.案例

4.1 立方体

设计立方体类、求出立方体的面积和体积

分别用全局函数和成员函数判断两个立方体是否相等

#include<iostream>
using namespace std;//立方体类设计
//1、创建立方体类
//2、设计属性
//3、设计行为 获取立方体面积和体积
//4、分别利用全局函数和成员函数 判断两个立方体是否相等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 + 2 * m_W * m_H + 2 * m_L * m_H;}//获取立方体的体积int calculateV() {return m_L * m_W * m_H;}//利用成员函数判断两个立方体是否相等bool isSameByClass(Cube& c) {if (getL() == c.getL() && getW() == c.getW() && getH() == c.getH()) {return true;}return false;}private:int m_L;//长int m_W;//宽int m_H;//高
};//利用全局函数判断 两个立方体是否相等
bool isSame(Cube& c1, Cube& c2) {if (c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH()) {return true;}return false;
}int main(){//创建立方体对象Cube c1;c1.setL(10);c1.setW(10);c1.setH(10);cout << "c1的面积为:" << c1.calculateS() << endl;cout << "c1的体积为:" << c1.calculateV() << endl;//创建第二个立方体Cube c2;c2.setL(10);c2.setW(10);c2.setH(10);//利用全局函数判断bool ret = isSame(c1, c2);if (ret) {cout << "全局函数判断:c1和c2是相等的" << endl;}else {cout << "全局函数判断:c1和c2是不相等的" << endl;}//利用成员函数判断ret = c1.isSameByClass(c2);if (ret) {cout << "成员函数判断:c1和c2是相等的" << endl;}else {cout << "成员函数判断:c1和c2是不相等的" << endl;}system("pause");return 0;
}

4.2 点和圆的关系

设计一个圆形类(Circle),和一个点类(Point),计算点和圆的关系

#include<iostream>
using namespace std;//点类
class Point {
public://设置xvoid setX(int x) {m_X = x;}//获取xint getX() {return m_X;}//设置yvoid setY(int y) {m_Y = y;}//获取yint getY() {return m_Y;}
private:int m_X;int m_Y;
};//圆类
class Circle {
public://设置半径void setR(int r) {m_R = r;}//获取半径int getR() {return m_R;}//设置圆心void setCenter(Point center) {m_Center = center;}//获取圆心Point getCenter(){return m_Center;}private:int m_R;//半径//在类中可以让另一个类 作为本来中的成员Point m_Center;//圆心
};//判断点和圆关系
void isInCircle(Circle& c, Point& p) {//计算两点之间距离 平方int distance =(c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) +(c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());//计算半径的平方int rDistance = c.getR() * c.getR();//判断关系if (distance == rDistance) {cout << "点在圆上" << endl;}else if (distance > rDistance) {cout << "点在圆外" << endl;}else {cout << "点在圆内" << endl;}
}
int main(){//创建圆Circle c;c.setR(10);Point center;center.setX(10);center.setY(0);c.setCenter(center);//创建点Point p;p.setX(10);p.setY(10);//判断关系isInCircle(c, p);system("pause");return 0;
}

在实际开发当中不可能把全部类写到一个文件中,所以要分开几个文件写poi
point.h

#pragma once //防止头文件出现重复性
#include <iostream>
using namespace std;class Point {
public://函数声明//设置xvoid setX(int x);//获取xint getX();//设置yvoid setY(int y);//获取yint getY();private://变量声明int m_X;int m_Y;
};

point.cpp

#include"point.h"//设置xvoid Point:: setX(int x) {  //加Point::使其变成成员函数m_X = x;}//获取xint Point:: getX() {return m_X;}//设置yvoid Point:: setY(int y) {m_Y = y;}//获取yint Point:: getY() {return m_Y;}

circle.h

#pragma once
#include<iostream>
using namespace std;
#include"point.h"class Circle {
public://设置半径void setR(int r); //获取半径int getR();//设置圆心void setCenter(Point center);//获取圆心Point getCenter();private:int m_R;//半径//在类中可以让另一个类 作为本来中的成员Point m_Center;//圆心
};

circle.cpp

#include"circle.h"//设置半径void Circle:: setR(int r) {m_R = r;}//获取半径int Circle:: getR() {return m_R;}//设置圆心void Circle:: setCenter(Point center) {m_Center = center;}//获取圆心Point Circle:: getCenter(){return m_Center;}

相关文章:

【C++】封装

1.封装的意义 封装是C面向对象三大特性之一 实例化&#xff08;通过一个类 创建一个对象的过程&#xff09; 类中的属性和行为 我们统一称为 成员 属性 成员属性 成员变量 行为 成员函数 成员方法 封装的意义&#xff1a; 1.将属性和行为作为一个整体&#xff0c;表现生活中的事…...

Maxwell安装部署

1 Maxwell输出格式 database&#xff1a;变更数据所属的数据库table&#xff1a;变更数据所属的表type&#xff1a;数据变更类型ts&#xff1a;数据变更发生的时间xid&#xff1a;事务idcommit&#xff1a;事务提交标志&#xff0c;可用于重新组装事务data&#xff1a;对于inse…...

说一下JVM类加载机制?

Java中的所有类&#xff0c;都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类&#xff0c;而它的工作就是把class文件从硬盘读取到内存中。 在写程序的时候&#xff0c;我们几乎不需要关心类的加载&#xff0c;因为这些都是隐式装载的&#xff0c;除非我们有特殊…...

解决SpringAMQP工作队列模型程序报错:WARN 48068:Failed to declare queue: simple.queue

这里写目录标题 1.运行环境2.报错信息3.解决方案4.查看解决之后的效果 1.运行环境 使用docker运行了RabbitMQ的服务器&#xff1a; 在idea中导入springAMQP的jar包&#xff0c;分别编写了子模块生产者publisher&#xff0c;消费者consumer&#xff1a; 1.在publisher中运行测试…...

mysql在服务器中的主从复制Linux下

mysql在服务器中的主从复制Linux下 为什么要进行主从复制主从复制的原理主从复制执行流程操作步骤主库创建从库创建 测试 为什么要进行主从复制 在业务中通常会有情况&#xff0c;在sql执行时&#xff0c;将表锁住&#xff0c;导致不能进行查询&#xff0c;这样就会影响业务的…...

QT-Day2

思维导图 作业 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#x…...

流量分析——陇剑杯 2021【签到、jwt】

目录 签到1、攻击者正在进行的可能是什么协议的网络攻击 jwt1、该网站使用了______认证方式。前置知识&#xff1a;解&#xff1a; 2、黑客绕过验证使用的jwt中&#xff0c;id和username是3、黑客获取webshell之后&#xff0c;权限是什么4、黑客上传的恶意文件文件名是5、黑客在…...

Java并发基础:原子类之AtomicIntegerFieldUpdater全面解析

本文概要 AtomicIntegerFieldUpdater类提供了一种高效、简洁的方式来原子性地更新对象的volatile字段&#xff0c;无需使用重量级的锁机制&#xff0c;它通过基于反射的API实现了细粒度的并发控制&#xff0c;提升了多线程环境下的性能表现。 AtomicIntegerFieldUpdater核心概…...

普中51单片机学习(串口通信)

串口通信 原理 计算机通信是将计算机技术和通信技术的相结合&#xff0c;完成计算机与外部设备或计算机与计算机之间的信息交换 。可以分为两大类&#xff1a;并行通信与串行通信。并行通信通常是将数据字节的各位用多条数据线同时进行传送 。控制简单、传输速度快&#xff1…...

【ArcGIS】利用高程进行坡度分析

在ArcGIS中利用高程进行坡度分析 坡度ArcGIS实操参考 坡度 坡度是地表单元陡缓的程度&#xff0c;通常把坡面的垂直高度和水平距离的比值称为坡度。 坡度的表示方法有百分比法、度数法、密位法和分数法四种&#xff0c;其中以百分比法和度数法较为常用。 &#xff08;1&#…...

递归读取文件夹下的所有文件

水一篇文章 &#x1f436; 代码 package file;import org.apache.commons.lang3.StringUtils; import org.junit.Test;import java.io.File; import java.util.Objects;/*** FlattenDirFiles** author allens* date 2024/2/19*/ public class FlattenDirFiles {// 文件数量pri…...

phpspreadsheet导出数据和图片到excel

仅作记录&#xff0c;废话不多说 前提是已经安装了phpspreadsheet &#xff08; composer require phpoffice/phpspreadsheet &#xff09; 一、 数据拼装&#xff0c;调用excel类 <?php /*** 电子台账* Date: 2023/4/20* Time: 17:28*/namespace app\store\controlle…...

Seata的 TCC 模式

目录 概述 使用 依赖与配置 代码 概述 TCC 模式是一种侵入式的分布式事务解决方案&#xff0c;它不依赖于数据库的事务&#xff0c;而是要求开发者自定义完成 预提交、提交、回滚的方法逻辑。因此&#xff0c;它是一个种偏 复杂、灵活、有侵入性 的分布式事务处理方案。 De…...

Vue全局指令防止重复点击(等待请求)

继《vue之全局请求loading》之后&#xff0c;总觉得全局loading有时候不太…友好&#xff0c;所以总想将loading加到被点击的元素上面&#xff0c;于是乎就想到了点击事件与请求方法相关联&#xff0c;本想重写组件的click方法&#xff0c;但是这样对组件的影响太大&#xff0c…...

数据库索引面试的相关问题

查看索引的执行计划 索引失效的情况 1、索引列上做了计算&#xff0c;函数&#xff0c;类型转换等操作。索引失效是因为查询过程需要扫描整个索引并回表。代价高于直接全表扫描。 Like匹配使用了前缀匹配符“%abc” 字符串不加引号导致类型转换。 原因&#xff1a; 常见索…...

Spring启动生命周期

Spring Boot 生命周期详解 Spring Boot 应用程序的生命周期包含几个阶段&#xff0c;每个阶段都有特定的事件和钩子&#xff0c;允许开发者在应用程序的不同生命周期阶段插入自定义逻辑。以下是 Spring Boot 生命周期的主要阶段和对应的事件&#xff1a; 准备阶段&#xff1a;…...

瑞芯微RK3568芯片介绍

RK3568简介 RK3568是一款由瑞芯微电子有限公司&#xff08;Rockchip Electronics Co. Ltd&#xff09;推出的高性能多媒体处理器&#xff0c;定位于中高端市场&#xff0c;被广泛应用于平板电脑、多媒体盒子、电子看板和工业控制等领域。以下是对这款芯片的简要介绍&#xff1…...

15.一种坍缩式的简单——组合模式详解

当曾经的孩子们慢慢步入社会才知道&#xff0c;那年味渐淡的春节就像是疾驰在人生路上的暂停键。 它允许你在隆隆的鞭炮声中静下心来&#xff0c;瞻前顾后&#xff0c;怅然若失。 也允许你在寂静的街道上屏气凝神&#xff0c;倾听自己胸腔里的那团人声鼎沸。 孩子们会明白的&am…...

Node.js的debug模块源码分析及在harmonyOS平台移植

Debug库 是一个小巧但功能强大的 JavaScript 调试工具库&#xff0c;可以帮助开发人员更轻松地进行调试&#xff0c;以便更快地发现和修复问题。它的主要特点是可以轻松地添加调试日志语句&#xff0c;同时在不需要调试时可以轻松地禁用它们&#xff0c;以避免在生产环境中对性…...

【Crypto | CTF】BUUCTF RSA2

天命&#xff1a;密码学越来越难了&#xff0c;看别人笔记都不知道写啥 天命&#xff1a;莫慌&#xff0c;虽然我不会推演法&#xff0c;但我可以用归纳法 虽然我不知道解题的推演&#xff0c;但我可以背公式啊哈哈哈 虽然我不会这题&#xff0c;但是我也能做出来 公式我不知…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

Docker 运行 Kafka 带 SASL 认证教程

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

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...