【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;}

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

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

相关文章

【Python】2019年蓝桥杯省赛真题——完全二叉树的权值

蓝桥杯 2019 省 A&B&#xff1a;完全二叉树的权值 题目描述 给定一棵包含 N N N 个节点的完全二叉树&#xff0c;树上每个节点都有一个权值&#xff0c;按从上到下、从左到右的顺序依次是 A 1 , A 2 , ⋯ A N A_1,A_2, \cdots A_N A1​,A2​,⋯AN​&#xff0c;如下图所…

Python接口自动化框架设计到开发,赶紧用起来!

1.如何设计一个接口自动化测试框架 根据接口地址、接口类型、请求数据、预期结果来进行设计&#xff0c;对于需要登录后才能进行操作的接口那么则需要进行header cookie等数据的传递&#xff0c;自动化测试的难点就是数据依赖。 2.python操作excel获得内容 首先python操作exce…

react中useState、setState、usemeno、meno区别

useState和setState区别及是否是异步 useState和setState是异步 useState&#xff1a; useState 是React函数组件中的钩子&#xff0c;用于声明状态变量。 通过 useState&#xff0c;你可以在函数组件中添加状态&#xff0c;而无需创建类组件。 useState 返回一个数组&…

Java 学习和实践笔记(16):类的理解以及初始值

类&#xff0c;英文名叫class。基本上对应的就是语言里的名词。 比如&#xff0c;房子、人、树、花、汽车等等&#xff0c;这些名词&#xff0c;这些可以定义成类。 以房子为例&#xff0c;作为一个房子&#xff0c;它一定有相应的属性&#xff0c;比如房顶、墙、门、窗等等&…

windows下采用 nginx配置websocket支持wss流程

第一步、安装OpenSSL &#xff08;1&#xff09;下载OpenSSL软件包 地址&#xff1a;https://slproweb.com/products/Win32OpenSSL.html OpenSSL版本说明&#xff1a; Win64 OpenSSL v1.1.1wLight&#xff0c;安装Win64 OpenSSL v1.1.1w最常用的软件包 Win64 OpenSSL v1.1…

动态头部:统一目标检测头部与注意力

论文地址:https://arxiv.org/pdf/2106.08322.pdf ai阅读论文_论文速读_论文阅读软件-网易有道速读 创新点是什么? 这篇文档的创新点是提出了一种统一的方法&#xff0c;将对象检测头和注意力机制结合起来。作者在文中提出了一种称为Dynamic Head的方法&#xff0c;通过引入…

k8s学习整理文档

整理文档 ‍ ‍ 实验环境 服务器 最低配置要求: 2 核虚拟 CPU4 GB 内存20 GB 储存空间X 4 台 (三台集群,一台镜像仓库服务器) 网络环境 由于搭建网络需要,同时要让各个主机互通,因此这里需要对云服务器设置专门的网络(同时也需要开放服务器对应的公网 IP) 在云…

构建高效稳定的Linux服务器环境

构建高效稳定的Linux服务器环境 构建高效稳定的Linux服务器环境对于保障系统的运行稳定性和性能至关重要。下面将介绍一些实用指南和最佳实践&#xff0c;帮助您构建一个高效稳定的Linux服务器环境。 更新系统和软件 定期更新系统和软件是维护Linux服务器环境稳定性和安全性…

matplotlib使用案例3:通过自定义图例类实现图例的任意方向(行 or 列)的排列

这个方法的核心依然是基于matplotlib.legend._get_legend_handles_labels函数。然后将得到的handlers, labels进行重排,使得即使再调用Legend类的绘制方法对图例进行列排列,最终的效果也是图例的行显示,如[1、2、3、4、5、6],当指定ncols=2,Legend类的绘制方法得到的图例如…

JS前端高频面试

JS数据类型有哪些&#xff0c;区别是什么 js数据类型分为原始数据类型和引用数据类型。 原始数据类型包括&#xff1a;number&#xff0c;string&#xff0c;boolean&#xff0c;null&#xff0c;undefined&#xff0c;和es6新增的两种类型&#xff1a;bigint 和 symbol。&am…

STM32—启用按键

​ 目录 1 、电路构成及原理图 2、编写实现代码 main.c main.h key.c 3、代码讲解 4、 烧录到开发板调试、验证代码 5、检验效果 本人使用的是朗峰 STM32F103 系列开发板&#xff0c;此笔记基于这款开发板记录。 1 、电路构成及原理图 重要&#xff01;一定先用短路…

LabVIEW轨道交通列车牵引制动试验平台

LabVIEW轨道交通列车牵引制动试验平台 概述 面对城市轨道交通领域对于高效、准确牵引制动系统的迫切需求&#xff0c;开发了一套基于LabVIEW软件与硬件相结合的试验平台。该平台模拟列车的牵引、制动等工况&#xff0c;通过高精度的数据采集与实时图形化展示&#xff0c;提升…

langchain 为什么无法按照预期的效果进行回复

如果在使用 Langchain 或类似的工具时遇到了无法按照预期效果回复的问题&#xff0c;可能有几个原因&#xff1a; 理解偏差&#xff1a;AI 可能没有正确理解您提供的原文或问题的意图。这可能是因为原文表述不够清晰或者 AI 在处理特定语言结构时出现偏差。信息缺失&#xff1…

工具:clang-format使用

Visual Studio 在扩展-》管理扩展-》联机-》搜索Format on Save (for VS2022)插件&#xff0c;并安装 安装需要关闭VS&#xff0c;安装后重新打开vs。 这样每次保存源文件时就会自动调用vs默认的clang-format.exe对源码进行缩进&#xff0c;空格等进行格式化 如果想使用自定…

c# 哈希表(Hash Table)

在 C# 中&#xff0c;哈希表&#xff08;Hash Table&#xff09;是一种基于哈希函数实现的数据结构&#xff0c;用于存储键值对。哈希表允许快速插入、删除和查找操作&#xff0c;其性能通常比线性数据结构&#xff08;如数组或链表&#xff09;更优秀&#xff0c;特别在大数据…

centos docker已启动的jenkin 配置 maven 并重启

在 CentOS 系统中&#xff0c;如果已经有一个正在运行的 Docker 容器中的 Jenkins&#xff0c;并且你想要更新配置以使用宿主机上的 Maven&#xff0c;可以按照以下步骤操作&#xff1a; 查看当前运行的 Jenkins 容器&#xff1a; docker ps -a找到你的 Jenkins 容器 ID 或名称…

3028. 边界上的蚂蚁

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 边界上有一只蚂蚁&#xff0c;它有时向 左 走&#xff0c;有时向 右 走。 给你一个 非零 整…

CSS列表学习2

之前学习了列表&#xff1b;继续熟悉&#xff1b; <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/><title></title><meta charset"utf-8" /><…

leetcode hot100单词拆分

在本题中&#xff0c;我们是要把一个字符串&#xff0c;判断是否能用给的字符串数组中的单词进行拆分&#xff0c;如果可以则返回true&#xff0c;不能的话则返回false。这个题一开始看无法与背包问题联系在一起。但仔细考虑&#xff0c;就是用物品&#xff08;给的字符串数组中…

操作系统学习案例20240222-liunx自定义systemctl系统服务

1 概述信息 通过tar安装的mysql一般需要直接使用mysql safe进行启动。&#xff08;其实用service比较简洁&#xff0c;谁让现在都在用systemctl了&#xff09; 2 使用service方案 cp ${mysql}sql/support-files/mysql.server /etc/init.d/mysqld service start mysqld 3 使用…