C++--封装

2023-11-06

目录

封装

封装的含义

封装的意义1

实例一

实例二


C++面对对象的三大特点:继承、封装、多态。

封装

封装的含义

  • 将对象的属性和行为作为一个整体,表现生活中的事物。
  • 将属性和行为加以权限控制

封装的意义1

设计一个类,将属性和行为写到一起,表现事物。

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

实例一

设计一个圆类,求圆的周长和面积

#include<iostream >
#include<string>

using namespace std;
const double PI = 3.14;

class Circle
{

public:
	//属性(半径
	int r;
	//行为(一般是函数
	/*double length()
	{
		return 2 * PI *r;
	}
	double area()
	{
		return PI*r*r;
	}*/
};
void getlength(int r)
{
	cout << "圆的周长为:" << 2 * r * PI<< endl;
}
void getarea(int r)
{
	cout << "圆的面积是:" << PI*r*r << endl;
}
int main()
{
	Circle c;//实例化
	/*cout << "length=" <<c.length() <<endl;
	cout << "" << c.area() << endl;*/
	getlength(4);
	getarea(4);
	system("pause");
	return 0;
}

运行结果:

实例二

设计圆类和点类,判断点和圆的关系。

 完整代码:

class point//点类
{
public:
	//设置x坐标
	void setx(int x)
	{
		p_x = x;
	}
	//获取x坐标
	int getx()
	{
		return p_x;
	}
	//设置y坐标
	void sety(int y)
	{
		p_y = y;
	}
	//获取y坐标
	int gety()
	{
		return p_y;
	}

private:
	//私有属性 点类有x,y坐标
	int p_x;
	int p_y;
};

class Circle//圆类
{
public:
	void setr(int r)//设置半径
	{
		c_r = r;
	}
	double getr()//获取半径
	{
		return c_r;
	}
	void setcenter(point center)
	{
		c_center = center;
	}
	point getcenter()
	{
		return c_center;
	}
private:
		int c_r;
		point c_center;//自定义的点类
		                //在类中,让另一个类做本类中的成员
};


//判断点和圆关系的函数
void Isincircle(Circle &c, point &p)
{
	//计算两点之间距离的平方
	int d =
		(c.getcenter().getx() - p.getx())*(c.getcenter().getx() - p.getx()) +
		(c.getcenter().getx() - p.getx())*(c.getcenter().getx() - p.getx());
	//计算半径的平方
	double R = c.getr()*c.getr();
	//判断关系
	if (d > R)
	{
		cout << "点在圆外" << endl;
	}
	else if (d < R)
	{
		cout << "点在圆内" << endl;
	}
	else
	{
		cout << "点在圆上" << endl;
	}
}

int main()
{
	Circle c;//圆类实例化
	c.setr(10);

	point p;//点类实例化
	p.setx(1);
	p.sety(0);
	point center;
	center.setx(0);//原点为圆心
	center.sety(0);
	c.setcenter(center);
	Isincircle(c, p);//判断关系
	
	system("pause");
	return 0;
}

运行结果:

 还可以将point类与circle类写进头文件:

创建相应的point.h头文件,与point.cpp源文件:

#pragma once
#include<iostream>
using namespace std;

class point//点类
{
public:
	//设置x坐标
	void setx(int x);
	
	//获取x坐标
	int getx();
		
	//设置y坐标
	void sety(int y);
	
	//获取y坐标
	int gety();

private:
	//私有属性 点类有x,y坐标
	int p_x;
	int p_y;
};
#include"point.h"
	//设置x坐标
	void point ::setx(int x)//
	{
		p_x = x;
	}
	//获取x坐标
	int point::getx()
	{
		return p_x;
	}
	//设置y坐标
	void point::sety(int y)
	{
		p_y = y;
	}
	//获取y坐标
	int point::gety()
	{
		return p_y;
	}

同理,创建相应的circle.h头文件与circle.cpp源文件:

#pragma once
#include<iostream>
using namespace std;
#include"point.h"

class Circle//圆类
{
public:
	void setr(int r);
	double getr();
	void setcenter(point center);
	point getcenter();
	
private:
	int c_r;
	point c_center;//自定义的点类
	//在类中,让另一个类做本类中的成员
};

#include"Circle.h"

	void Circle::setr(int r)//设置半径
	{
		c_r = r;
	}
	double Circle::getr()//获取半径
	{
		return c_r;
	}
	void Circle::setcenter(point center)
	{
		c_center = center;
	}
	point Circle::getcenter()
	{
		return c_center;
	}


此时要在主函数中添加:

#include<iostream>

#include"point.h"

#include"Circle"

using namespace std;

//判断点和圆关系的函数
void Isincircle(Circle &c, point &p)
{
	//计算两点之间距离的平方
	int d =
		(c.getcenter().getx() - p.getx())*(c.getcenter().getx() - p.getx()) +
		(c.getcenter().getx() - p.getx())*(c.getcenter().getx() - p.getx());
	//计算半径的平方
	double R = c.getr()*c.getr();
	//判断关系
	if (d > R)
	{
		cout << "点在圆外" << endl;
	}
	else if (d < R)
	{
		cout << "点在圆内" << endl;
	}
	else
	{
		cout << "点在圆上" << endl;
	}
}

int main()
{
	Circle c;//圆类实例化
	c.setr(10);

	point p;//点类实例化
	p.setx(1);
	p.sety(0);
	point center;
	center.setx(0);//原点为圆心
	center.sety(0);
	c.setcenter(center);
	Isincircle(c, p);//判断关系
	
	system("pause");
	return 0;
}

运行结果与上述一致。

看B站黑马程序员的课,自己记得笔记和重点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++--封装 的相关文章

  • 为 DocumentDb 设置自定义 json 转换器

    我正在使用类型化 DocumentQuery 从 Azure DocumentDb 集合中读取文档 from f in client CreateDocumentQuery
  • 如何使用不同的基本路径托管 Blazor WebAssembly 应用程序

    我有一个 Blazor Webassemble NET 托管应用程序 在我们托管它的服务器上 应用程序的基本路径将是mydomain com coolapp 因此 为了尝试让应用程序在服务器上正确呈现 我一直遵循本页 应用程序基本路径 部分
  • 在 LINQ 查询中进行转换

    是否可以在 LINQ 查询中进行强制转换 为了编译器的缘故 下面的代码并不糟糕 但最好将其放入一个查询中 Content content dataStore RootControl as Controls Content List
  • 未找到 DEADLINE 调度策略

    我想在 C 中实现 DEADLINE 调度策略 我知道该功能已实现Linux 3 14 10我正在使用 Ubuntu 14 04Linux 3 17 0 031700 lowlatency 201410060605 SMP PREEMPT这
  • 并行运行多个任务

    我有一个代理列表 每个代理都会访问不同的站点并从站点中提取所需的数据 目前它一次只做一个 但我希望同时运行 10 20 个任务 这样它就可以一次性从 20 个站点下载 而不是只下载一个 这是我目前正在做的事情 private async T
  • 如何在 C++ 中为指针“this”赋值

    在函数中 如何分配this一个新的价值 您可以分配对象this点于 this XY 但你不能分配直接值this this XY Error Expression is not assignable
  • 如何以编程方式删除受信任的根证书颁发机构中的证书?

    我需要能够从组织中的每台电脑中删除特定的证书 是的 我可以逐个座位 但我要到周四才能完成 而且我没有人力逐个座位 是否有使用 C 的编程方式来执行此操作 我认为你不需要编写任何 C 看看certmgr exe del http msdn m
  • 大量互斥体对性能的影响

    假设我有一个包含 1 000 000 个元素的数组 以及多个工作线程 每个线程都操作该数组中的数据 工作线程可能会使用新数据更新已填充的元素 但每个操作仅限于单个数组元素 并且独立于任何其他元素的值 使用单个互斥锁来保护整个数组显然会导致高
  • DateTime.ParseExact - 为什么 yy 变成 2015 而不是 1915

    为什么 NET 假定以下年份是 2015 年 而不是 1915 年 var d DateTime ParseExact 20 11 15 dd MM yy new CultureInfo en GB 我想 它会尝试接近 但其背后是否有合理的
  • 当我尝试传递临时地址作为参数时,它是一个 UB 吗?

    对于以下 C 代码 include
  • 为什么连续抛出 2 个异常不会生成无法访问的代码警告?

    为什么以下代码行不会创建编译器警告 void Main throw new Exception throw new Exception 据我所知 编译器应该通知您无法到达第二个抛出异常 这显然是一个编译器错误 它是在 C 3 0 中引入的
  • 使用任一默认捕获模式时,这是通过复制捕获还是 (*this) 通过引用捕获?是一样的吗?

    当我看到以下工作时我有点困惑 struct A void g void f g 但后来我发现this https stackoverflow com a 16323119 5825294答案非常详细地解释了它是如何工作的 本质上 它归结为t
  • C# 可以为控制台应用程序部分类“程序”类吗?

    我想知道是否可以将为任何控制台应用程序创建的默认 程序 类更改为部分类 我想这样做是因为我想要更好的组织 而不是将所有方法都放在按区域分类的 1 个文件中 对我来说 将某些方法类别放在单独的文件中会更有意义 我对分部类的理解是 它是多个文件
  • 为什么我可以在另一个函数中定义一个函数?

    请参阅下面的代码 我在另一个函数中定义了一个函数 void test1 void void test2 void printf test2 n printf test1 n int main void test1 return 0 这个用法
  • c++ - <未解析的重载函数类型>

    在我的班级里叫Mat 我想要一个将另一个函数作为参数的函数 现在我有下面 4 个函数 但是在调用 print 时出现错误 第二行给了我一个错误 但我不明白为什么 因为第一行有效 唯一的区别是功能f不是班级成员Mat but f2是 失败的是
  • 查找数组中的多个索引

    假设我有一个像这样的数组 string fruits watermelon apple apple kiwi pear banana 是否有一个内置函数可以让我查询 apple 的所有索引 例如 fruits FindAllIndex ap
  • 在多线程环境中捕获信号

    我有一个大型程序 需要尽可能具有弹性 并且有大量线程 我需要捕获所有信号SIGBUS SIGSEGV 并在必要时重新初始化有问题的线程 或者禁用该线程以继续减少功能 我的第一个想法是做一个setjump 然后设置信号处理程序 可以记录问题
  • 异步/等待 - 是*并发*吗?

    我一直在考虑 C 5 中新的异步内容 并且出现了一个特殊问题 据我了解 await关键字是一个简洁的编译器技巧 语法糖来实现连续传递 http en wikipedia org wiki Continuation passing style
  • C++ 中的析构函数

    我的 AB h 文件中有一个构造函数 class AB private int i public AB i 0 constructor AB i 0 destructor virtual void methodA unsigned int
  • 如何将模型绑定到动态创建的类 nancyfx

    首先感谢任何愿意查看我的问题的人 我对 Nancyfx 还很陌生 在尝试将 JSON 有效负载绑定到动态创建的类时遇到问题 我按照这篇文章中的代码动态创建了该类 在C 中动态创建一个类 https stackoverflow com que

随机推荐

  • 软件测试之网络协议基础

    软件测试之网络协议基础 前言 我会在此账号上持续更新 软件测试的文章 包括网络部分 前端代码部分 数据库部分 软件测试部分 互联网协议 osi 7层协议 tcp ip 5层协议 网络协议的存在是为了两者中间根据一定的协议沟通交流 每层运行常
  • 光线跟踪(RayTracing)原理及c++实现

    Chapt1 Why to write a RayTracing Render 提到Computer Graphics 众所周知的是如OpenGL Direct3D这样非常流行的光栅化渲染器 事实上 这些大部分应用于游戏制作的API主要为实
  • Flutter控件——布局控件:层叠

    Stack 层叠布局 Android 中的 Frame 布局是相似的 子组件可以根据距父容器四个角的位置来确定自身的位置 层叠布局允许子组件按照代码中声明的顺序堆叠起来 Flutter中使用Stack和Positioned这两个组件来配合实
  • 怎么关闭win10虚拟机服务器,win10系统彻底关闭退出vmware虚拟机的步骤

    有关win10系统彻底关闭退出vmware虚拟机的操作方法想必大家有所耳闻 但是能够对win10系统彻底关闭退出vmware虚拟机进行实际操作的人却不多 其实解决win10系统彻底关闭退出vmware虚拟机的问题也不是难事 小编这里提示两点
  • 数十万条以上的大量数据如何快速插入数据库中

    引言 这几天工作这边同事遇到了一个问题 对十五万条数据进行计算 插入数据库的时候耗时很严重 使用了批量插入对十五万条数据插入仍然耗费了30秒 前面计算也耗费了二十多秒 系统流畅度因此很难堪 经过我的排查发现主要是两个点需要优化 1 计算的算
  • 关于STM32在线升级文件大或者跳转后中断有问题的解决方法(IAR环境)

    首先 大家都知道是跳转到每个程序的复位中断地址 一开始我的IAR环境的启动文件是没有复位中断地址的 可以去IAR官网随便下载一个重新覆盖掉启动文件 当然还得看你的外设中断有没有包含 或者有多的要去掉 DCD Handler类型的 如果遇到I
  • 怎样在 Markdown 中使程序代码带上行号

    在图灵社区使用 Markdown 写文章时 如果在一段文字的每行开头加上四个空格 或者一个制表符 Tab 这段文字就会被视为程序代码 这样 就会自动识别所用的编程语言 进行代码染色 语法高亮显示 但是 如果这段程序很长的话 就有两个小问题
  • 假设检验,显著性,置信水平,p值,点估计

    1 为什么需要假设检验 以下图激光器项目为例子 抽样30个 改善前720mw 改善后723mw 有一点提升 提升小 可能是正常的波动 所以不一定真的提升了 所以到底是正常波动还是真的改善了 需要结合功率标准差进行分析 标准差决定了波动的情况
  • 医疗管理系统-图形报表、POI报表

    目录 1 套餐预约占比饼形图 1 1 需求分析 1 2 完善页面 1 2 1 导入ECharts库 1 2 2 参照官方实例导入饼形图 1 3 后台代码 1 3 1 Controller 1 3 2 服务接口 1 3 3 服务实现类 1 3
  • STM8 学习笔记 5:时钟

    1 概述 时钟是单片机的脉搏 是单片机的驱动源 使用任何一个外设都必须打开相应的时钟 这样的好处是 如果不使用一个外设的时候 就把它的时钟关掉 从而可以降低系统的功耗 达到节能 实现低功耗的效果 每个时钟tick 系统都会处理一步数据 这样
  • 图数据库-Neo4j:linux centOS7安装

    1 下载 下载地址 社区版免费 https neo4j com download other releases releases 2 解压 tar axvf neo4j community 3 4 5 unix tar gz 3 修改配置文
  • 完全图解自然语言处理中的Transformer——BERT基础(入门长文)

    翻译自Jay Alammar Blog 在上一篇文章可视化Seq2Seq attention中 我们介绍了现在深度学习中特别常用的Attention 注意力 机制 注意力可以提升机器翻译的效果 这篇文章介绍Transformer 一种使用注
  • 深入理解Netty高性能网络框架

    大家好 今天我们来聊聊Netty的那些事儿 我们都知道Netty是一个高性能异步事件驱动的网络框架 它的设计异常优雅简洁 扩展性高 稳定性强 拥有非常详细完整的用户文档 同时内置了很多非常有用的模块基本上做到了开箱即用 用户只需要编写短短几
  • 平衡二叉树(AVL)python实现

    AVL树是一种特殊的二叉搜索树 BST树 数据极端情况下 二叉搜索树会退化成为单链表 但是AVL树通过旋转操作规避了这个问题 查找平均复杂度 O logn AVL树不适于删除的情况 class AVLTreeNode object def
  • Nginx 配置日志打印--HTTP报文

    http include mime types default type application octet stream log format main remote addr remote user time local request
  • loadrunner12——录制脚本时网络连接错误——无法弹出浏览器解决方法

    loadrunner12可以使用火狐浏览器 如果大家安装有问题 为了避免出错 可根据以下地址重新进行安装 https blog csdn net lmm0513 article details 87935863 1 首先打开loadrunn
  • 1到100, 中间随机抽走一个数,用算法得出是哪个数

    import java util ArrayList import java util HashMap import java util List import java util Map public class HunderTest p
  • UNIX环境高级编程 学习笔记 第二章 UNIX标准及实现

    C语言的ANSI标准在1989年得到批准 此标准也被采纳为国际标准ISO IEC 9899 1990 ANSI是美国国家标准学会 American National Standards Institute 它是国际标准化组织ISO Inte
  • 什么是全国大学生电子设计大赛?如何备战?

    前言 全国大学生电子设计竞赛是教育部和工业和信息化部共同发起的大学生学科竞赛之一 每一届都有非常多的大学生参加 但每届的比赛前夕 总会有很多同学并不清楚比赛的相关信息 流程以及如何去备战比赛 导致在比赛中出现准备不足或违法比赛规则等现象从而
  • C++--封装

    目录 封装 封装的含义 封装的意义1 实例一 实例二 C 面对对象的三大特点 继承 封装 多态 封装 封装的含义 将对象的属性和行为作为一个整体 表现生活中的事物 将属性和行为加以权限控制 封装的意义1 设计一个类 将属性和行为写到一起 表