当前位置: 首页 > 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;但是我也能做出来 公式我不知…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...