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

单片机学习笔记---红外遥控红外遥控电机调速(完结篇)

目录 低电平触发中断和下降沿触发中断的区别 红外遥控 Int0.c Int.h Timer0.c Timer0.h IR.c IR.h main.c 红外遥控电机调速 Timer1.c Timer.h Motor.c Motor.h main.c 上一节讲了红外发送和接收的工作原理&#xff0c;这一节开始代码演示&#xff01; 提前说…...

Linux第62步_备份移植好的所有的文件和文件夹

1、备份“my-tfa”目录下所有的文件和文件夹 1)、打开终端 输入“ls回车”&#xff0c;列出当前目录下所有的文件和文件夹 输入“cd linux回车”&#xff0c;切换“linux”目录下 输入“ls回车”&#xff0c;列出当前目录下所有的文件和文件夹 输入“cd atk-mp1/回车”&am…...

【xss跨站漏洞】xss漏洞前置知识点整理

xss漏洞成因 xss漏洞是一种前端javascript产生的漏洞。 我们网站基本都是会用到javascript编写一些东西&#xff0c;浏览器也能直接识别javascript。 如果有一个地方能够输入文字&#xff0c;但是他又没有过滤你的输入&#xff0c;那么自己或者他人看到你输入的javascript代…...

mac下mysql 常用命令

mysql启动命令 在Mac OS X启动和停止MySQL服务的命令&#xff0c; 启动MySQL服务 sudo /usr/local/mysql/support-files/mysql.server start 停止MySQL服务 sudo /usr/local/mysql/support-files/mysql.server stop 重启MySQL服务 sudo /usr/local/mysql/support-files/mys…...

2.21号qt

1.QMainWindow中常用的类 继承于QMainWindow类&#xff0c;原因该类提供了QWidget没有提供的成员函数。 菜单栏、工具栏、状态栏、浮动窗口&#xff08;铆接部件&#xff09;、核心部件 1.1 菜单栏 QMenuBar //创建菜单栏 QMenuBar 最多只能有一个 QMenuBar *mbar menu…...

什么是MVVM?MVC、MVP与MVVM模式的区别?

MVVM&#xff08;Model-View-ViewModel&#xff09;是一种软件架构模式&#xff0c;用于将用户界面&#xff08;View&#xff09;与业务逻辑&#xff08;Model&#xff09;分离&#xff0c;并通过ViewModel来连接两者。MVVM的目标是实现可测试性、可维护性和可复用性。 MVC&am…...

ElementUI组件的安装和使用

Element UI 是一款基于 Vue 2.0 的桌面端组件库&#xff0c;主要用于快速构建网站的前端部分。它提供了丰富的组件&#xff0c;如按钮、输入框、表格、标签页等&#xff0c;以及一些布局元素&#xff0c;如布局容器、分割线等。Element UI 的设计风格简洁&#xff0c;易于上手&…...

Laravel01 课程介绍以及Laravel环境搭建

Laravel01 课程介绍 1. Laravel2. mac开发环境搭建(通过Homebrew)3. 创建一个项目 1. Laravel 公司中面临着PHP项目与Java项目并行&#xff0c;所以需要我写PHP的项目&#xff0c;公司用的框架就是Laravel&#xff0c;所以在B站上找了一门课学习。 Laravel中文文档地址 https…...

面试redis篇-03缓存击穿

原理 缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮 解决方案一:互斥锁 解决方案二:逻辑过期 提问与回答 面试官 :什么是缓存击穿 ? 怎么解决 ? 回答: 缓存击穿的意思…...

k8s容器以及基础设施优化

1.硬件系统选型&#xff1a;宿主机通用配置16c/32GB/4网卡队列 2.os优化&#xff1a;单机支持百万tcp并发&#xff0c;/etc/sysctl.conf,/etc/security/limits.conf 3.k8s&容器层优化&#xff1a;性能优化initContainer 4.kube-dns优化&#xff1a;增大--cache-size,设置…...

做网站用的腾讯云服务器/长沙百度网站排名优化

你知道红木家具的面板有几种类型吗&#xff1f;你知道哪条边是大边&#xff0c;哪条边是抹头吗&#xff1f;你知道为什么传统红木家具一般不用独板制作的原因吗&#xff1f;今天941红木网小编就和大家聊聊红木家具面板小常识。大多数红木家具都有面板&#xff0c;如桌面、案面、…...

河北建设网官方网站/平台营销

结构化数据、半结构化数据和非结构化数据 结构化数据 结构化的数据是指可以使用关系型数据库表示和存储&#xff0c;表现为二维形式的数据。一般特点是&#xff1a;数据以行为单位&#xff0c;一行数据表示一个实体的信息&#xff0c;每一行数据的属性是相同的。举一个例子&am…...

苏州网站建设公司排名/如何创建一个网页

缓存 缓存作用 减少了冗余的数据传输&#xff0c;节省了网费。减少了服务器的负担&#xff0c; 大大提高了网站的性能加快了客户端加载网页的速度缓存分类 强制缓存 强制缓存&#xff1a;说白了就是第一次请求数据时&#xff0c;服务端将数据和缓存规则一并返回&#xff0c;下一…...

ps做网站的分辨率多少/搜索引擎营销是指

Python进行PDF转图片pdfplumber的可视化调试使用pdfplumber这个Python工具库&#xff0c;pdfplumber基于pdfminer.six。使用pdfplumber进行PDF转图片&#xff0c;简单快捷。同时pdfplumber还提供可视化的PDF内容提取调试支持&#xff0c;如上图。import pdfplumberpdf pdfplum…...

企业网站推广形式有/太原seo服务

之前写过一篇gridpanel有关动态列的博客&#xff0c;当时只是实验性的写写&#xff0c;实际项目中也没有用&#xff0c;因为是实验性的写&#xff0c;所以对实际项目考虑的问题不是很多&#xff0c;比如&#xff0c;如果是动态列&#xff0c;数据也是动态的&#xff0c;而且可能…...

外链的论坛网站/软件发布网

ubuntu 8.04 内核升级 dpkg -l 查看安装的文件 首先更新apt-get源 vim /etc/apt/sources.list deb http://old-releases.ubuntu.com/ubuntu/ hardy main restricted universe multiversedeb-src http://old-releases.ubuntu.com/ubuntu/ hardy main restricted universe mu…...