类和对象——封装

news/2024/2/28 16:54:11

师从黑马程序员

封装

封装的意义一

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

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

设计一个圆类,求圆的周长   代码:

示例1:

#include <iostream>
using namespace std;class Circle
{//访问权限//公共权限
public://属性//半径int m_r;//行为//获取圆的周长double calculateZC(){const float PI=3.14;return 2*PI*m_r;}
};int main()
{//通过圆类 创建具体的圆(对象)Circle c1;//给圆对象的属性进行赋值c1.m_r=10;cout<<"圆的周长为: "<<c1.calculateZC()<<endl;return 0;
}

示例2:

设计一个学生类,属性具有姓名和学号,姓名和学号可以赋值,并将其显示

#include <iostream>
using namespace std;class Student
{
public:// 定义构造函数,初始化姓名和学号Student(string name, int stuNum): m_name(name), m_stuNum(stuNum) {}// 姓名和学号的setter方法void setName(string name) { m_name = name; }void setStuNum(int stuNum) { m_stuNum = stuNum; }// 打印学生信息的方法void printStu(){cout << "学生姓名为:" << m_name << endl;cout << "学生学号为:" << m_stuNum << endl;}private:string m_name;int m_stuNum;
};int main()
{// 创建一个学生对象,并初始化姓名和学号Student s1("张三", 123456);// 调用打印学生信息的方法s1.printStu();return 0;
}

封装意义二:

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

访问权限有三种:

1、public   公共权限           成员  类内可以访问  类外可以访问

2、protected 保护权限        成员  类内可以访问  类外可以访问

3、private  私有权限           成员  类内可以访问  类外可以访问

#include <iostream>
using namespace std;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.m_Car="奔驰";  //保护权限内容,在类外访问不到//p1.m_Password=123;// 私有权限内容,类外访问不到p1.func();return 0;
}

struct和class区别

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

区别:

        struct默认权限为公共

        class默认权限为私有

#include <iostream>
using namespace std;class C1
{int m_A;
};struct C2
{int m_A;
};int main()
{C1 c1;// c1=100;  //在class里默认权限  私有,因此类外不可以访问C2 c2;c2=100;//在class里默认权限  公有,因此可以访问return 0;
}

成员属性设置为为私有

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

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

#include <iostream>
#include<string >
using namespace std;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<<"年龄输入有误,赋值失败"<<endl;return ;}m_Age=age;}//设置偶像void setIdol(string Idol){m_Idol=Idol;}
private:string m_Name; //姓名   可读可写int m_Age=18;  //年龄  只读  也可以写0~150string m_Idol;//偶像 只写
};
int main()
{Person p;//姓名设置p.setName("张三");//姓名获取cout<<"姓名: "<<p.getName()<<endl;//年龄设置p.setAge(160);//年龄获取cout<<"年龄: "<<p.getAge()<<endl;//只读//偶像设置p.setIdol("小明");//只写return 0;
}

联系案例1:设计立方体类

设计立方体类(Cube)

求出立方体的面积和体积

分别用全局函数和成员函数两个立方图是否相同

#include <iostream>
#include<string>
using namespace std;class Cube
{
private:int m_A;
public:// 构造函数初始化边长Cube(int A) : m_A(A) {}// 设置边长的成员函数void setA(int A){m_A = A;}// 获取边长的成员函数int getA(){return m_A;}// 计算面积的成员函数int getArea(){return m_A * m_A;}// 计算体积的成员函数int getVolume(){return m_A * m_A * m_A;}// 成员函数判断当前立方体与另一个立方体是否相同bool isSameCube(const Cube& other){return m_A == other.m_A;}
};// 全局函数判断两个立方体是否相同
bool areCubesSame(Cube c1, Cube c2)
{return c1.getA() == c2.getA();
}int main()
{Cube c1(10);Cube c2(5);cout << "立方体c1的边长为:" << c1.getA() << endl;cout << "立方体c1的面积为:" << c1.getArea() << endl;cout << "立方体c1的体积为:" << c1.getVolume() << endl;cout << "立方体c2的边长为:" << c2.getA() << endl;cout << "立方体c2的面积为:" << c2.getArea() << endl;cout << "立方体c2的体积为:" << c2.getVolume() << endl;// 使用成员函数判断是否相同cout << "成员函数判断:c1和c2是否相同?" << (c1.isSameCube(c2) ? "是" : "否") << endl;// 使用全局函数判断是否相同cout << "全局函数判断:c1和c2是否相同?" << (areCubesSame(c1, c2) ? "是" : "否") << endl;return 0;
}

联系案例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;}//获取Xint 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);return 0;
}

 若有侵权,请联系作者


http://www.ppmy.cn/news/1350034.html

相关文章

【EAI 015】CLIPort: What and Where Pathways for Robotic Manipulation

论文标题&#xff1a;CLIPort: What and Where Pathways for Robotic Manipulation 论文作者&#xff1a;Mohit Shridhar1, Lucas Manuelli, Dieter Fox1 作者单位&#xff1a;University of Washington, NVIDIA 论文原文&#xff1a;https://arxiv.org/abs/2109.12098 论文出处…

安装opencart

一、安装模板 Install SO Emarket Opencart 4 Theme 一&#xff1a;so_emarket_quick2 二&#xff1a;theme package installation 1、installed opencart Default 2、Extensions->Installer->Upload->so_emarket_theme_oc4011_home21_to_home35_v2.0.3->so_theme…

奶茶点餐|奶茶店自助点餐系统|基于微信小程序的饮品点单系统的设计与实现(源码+数据库+文档)

奶茶店自助点餐系统目录 目录 基于微信小程序的饮品点单系统的设计与实现 一、前言 二、系统功能设计 三、系统实现 1、商品信息管理 2、商品评价管理 3、商品订单管理 4、用户管理 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xff1a; 五、核心代码 …

CSS Selector—选择方法,和html自动——异步社区的爬取(动态网页)——爬虫(get和post的区别)

这里先说一下GET请求和POST请求&#xff1a; post我们平时是要加data的也就是信息&#xff0c;你会发现我们平时百度之类的 搜索都是post请求 get我们带的是params&#xff0c;是发送我们指定的内容。 要注意是get和post请求&#xff01;&#xff01;&#xff01; 先说一下异…

跟着cherno手搓游戏引擎【24】开启2D引擎前的项目总结(包括前置知识汇总)

前置技术&#xff1a; vs属性解释&#xff1a; MSBuild的入门完整教程&#xff08;包学包会&#xff09;-CSDN博客 配置界面&#xff1a; c动态链接和静态链接&#xff1a; 隐藏的细节&#xff1a;编译与链接_哔哩哔哩_bilibili 【底层】动态链接库(dll)是如何工作的&…

基于微信小程序的在线课堂的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

FTP服务简介(工作原理、连接模式、流行服务器软件)

FTP&#xff08;File Transfer Protocol&#xff0c;文件传输服务&#xff09;提供在Internet上的任意两台计算机之间相互进行的文件传输。只要双方主机都支持FTP协议&#xff0c;就可以利用FTP来进行文件传输。 工作原理 FTP服务是客户/服务器模式&#xff0c;用户通过客户机…

[C#] 如何使用ScottPlot.WPF在WPF桌面程序中绘制图表

什么是ScottPlot.WPF&#xff1f; ScottPlot.WPF 是一个开源的数据可视化库&#xff0c;用于在 WPF 应用程序中创建高品质的绘图和图表。它是基于 ScottPlot 库的 WPF 版本&#xff0c;提供了简单易用的 API&#xff0c;使开发人员能够通过简单的代码创建各种类型的图表&#…

第三百一十五回

文章目录 1. 概念介绍2. 基本用法3. 补充用法4. 内容总结 我们在上一章回中介绍了"再谈ListView中的分隔线"&#xff0c;本章回中将介绍showMenu的用法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在第一百六十三回中介绍了showMenu相关的内容…

【设计模式】23中设计模式笔记

设计模式分类 模板方法模式 核心就是设计一个部分抽象类。 这个类具有少量具体的方法&#xff0c;和大量抽象的方法&#xff0c;具体的方法是为外界提供服务的点&#xff0c;具体方法中定义了抽象方法的执行序列 装饰器模式 现在有一个对象A&#xff0c;希望A的a方法被修饰 …

MySQL-----DCL基础操作

▶ DCL简介 DCL英文全称是Data ControlLanguage(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访问权限。 DCL--管理用户 ▶ 查询用户 use mysql; select * from user; ▶ 创建用户 ▶ 语法 create user 用户名主机名 identified by 密码 设置为在任意主机上访问…

[自然语言处理|NLP] 文本分类与情感分析,数据预处理流程,包括了同义词替换和拼写纠正,以及使用NLTK库和TextBlob库进行标记化和情感分析(附代码)

[自然语言处理|NLP] 文本分类与情感分析,数据预处理流程,包括了同义词替换和拼写纠正,以及使用NLTK库和TextBlob库进行标记化和情感分析(附代码)。 自然语言处理(Natural Language Processing,简称NLP)是人工智能领域的一个重要分支,涉及了处理和理解人类语言的技术…

快速手动完成 VS 编写脚本自动化:如何选取最高效的工作方式?

那些不懂技术的朋友们可能会觉得&#xff0c;写代码写脚本不就是敲敲键盘嘛&#xff0c;搞那么高科技做什么&#xff0c;直接手工点点鼠标不就完事了。 这种看法很常见&#xff0c;但实际情况要复杂得多。 首先&#xff0c;手工操作虽然对于短期和小规模的任务来说似乎更快&am…

springboot177健身房管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

wireshark抓包问题及学习

wireshark抓包问题及学习 【场景1】服务A请求服务B经常超过3s&#xff0c;报错i/o timeout&#xff0c;想看下是否网络波动或者负载太高。需要抓包分析。 问题1&#xff1a; 超时时间不定&#xff0c;且请求量过大&#xff0c;一直抓了存文件里抓包文件过大。 解决学习&…

STM32 适合人群

STM32 适合各种需要进行嵌入式系统开发的人群&#xff0c;具体如下&#xff1a; 嵌入式系统工程师&#xff1a;嵌入式系统工程师可以使用 STM32 进行系统设计、硬件和软件编程、测试和部署等工作。学生和研究人员&#xff1a;学生和研究人员可以使用 STM32 进行实验、学习和研…

线性代数的本质——1 向量

向量是线性代数中最为基础的概念。 何为向量&#xff1f; 从物理上看&#xff0c; 向量就是既有大小又有方向的量&#xff0c;只要这两者一定&#xff0c;就可以在空间中随便移动。 从计算机应用的角度看&#xff0c;向量和列表很接近&#xff0c;可以用来描述某对象的几个不同…

利用Python和pandas库进行股票技术分析:移动平均线和MACD指标

利用Python和pandas库进行股票技术分析&#xff1a;移动平均线和MACD指标 介绍准备工作数据准备计算移动平均线计算MACD指标结果展示完整代码演示 介绍 在股票市场中&#xff0c;技术分析是一种常用的方法&#xff0c;它通过对股票价格和交易量等历史数据的分析&#xff0c;来…

备战蓝桥杯---组合数学基础1

让我们来几道高中的组合题吧&#xff1a; 1.我们一定有n个向下&#xff0c;为 2.我们挑最大的两个&#xff0c;条件是他们奇偶性相同&#xff0c;为2*A10,2; 3.用捆绑法即可。 4.我们用隔板法&#xff0c;为 5.问题等价于23个相同的球放到3个盒子里&#xff0c;每个盒子至少…

golang设置

golangci-lint 代码检查工具的集合&#xff0c;聚集了多种 Go 代码检查工具&#xff0c;如 golint 会自动查找项目中的 .golangci.yml 配置文件 会检查代码中潜在常见问题以及代码风格问题 # 文档&#xff1a;https://golangci-lint.run/ # https://github.com/golangci/golang…
最新文章