c++类与对象——封装

2023-11-01

1. 封装的意义

类和对象
C++面对对象三大特性:封装、继承、多态

C++认为万事万物都皆为对象,对象上有其属性和行为

例如:
人可以作为对象,属性有姓名、年龄、身高...行为有走、跑、吃饭、唱歌
车也可以作为对象、属性有轮胎、方向盘...行为有载入、放音乐
具有相同性质的对象,我们可以抽象为类,人属于人类,车属于车类*/

封装:
封装的意义:1.将属性和行为作为一个整体,表现生活中的事物
           2.将属性和行为加以权限控制
封装意义一:
      在设计类的时候,属性和行为写在一起,表现事情
语法:class 类名{ 访问权限: 属性 / 行为 };*/
#include <iostream>
using namespace std;

/*类和对象
  C++面对对象三大特性:封装、继承、多态
  
  C++认为万事万物都皆为对象,对象上有其属性和行为
  
例如:
    人可以作为对象,属性有姓名、年龄、身高...行为有走、跑、吃饭、唱歌
	车也可以作为对象、属性有轮胎、方向盘...行为有载入、放音乐
	具有相同性质的对象,我们可以抽象为类,人属于人类,车属于车类*/

/*封装:
  封装的意义:1.将属性和行为作为一个整体,表现生活中的事物
              2.将属性和行为加以权限控制
封装意义一:
          在设计类的时候,属性和行为写在一起,表现事情
语法:class 类名{ 访问权限: 属性 / 行为 };*/

//示例1.设计一个圆类,求园的周长
//园求周长的公式:2 * PI * 半径
const double PI = 3.14;

//class 代表设计一个类,类后面紧跟的就是类名称
class Circle
{
	//访问权限
	//公共权限
public:
	//属性
	int m_r;
	
	//行为
	//获取圆的周长
	double calculateZC()
	{
		return 2 * PI * m_r;
	}
};
int main()
{
	//通过圆类 创建具体的圆(对象)
	//实例化 (通过一个类 创建一个对象的过程)
	Circle c1;
	//给圆对象 的属性进行赋值
	c1.m_r = 10;
	
	cout << "圆的周长为:" << c1.calculateZC() << 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.m_Id = 1;
	//s1.m_Name = "张三";
	s1.setname("张三");
	s1.setid(1);
	//显示学生信息
	s1.showstudent();

	student s2;
	s2.m_Id = 2;
	s2.m_Name = "李四";
	s2.showstudent();

	system("pause");
	return 0;
}

3. 封装的意义2

封装意义二:
类在设计时,可以把属性和行为放在不同的权限下,加以控制
访问权限有三种: 
1.public     公共权限  成员类内可以访问,类外可以访问
2.protected  保护权限  成员类内可以访问,类外不可以访问,儿子可以访问父亲中的保护内容
3.private    私有权限  成员类内可以访问,类外不可以访问,儿子不可以访问父亲的私有内容
#include <iostream>
using namespace std;

/*封装意义二:
  类在设计时,可以把属性和行为放在不同的权限下,加以控制
  访问权限有三种: 
  1.public     公共权限  成员类内可以访问,类外可以访问
  2.protected  保护权限  成员类内可以访问,类外不可以访问,儿子可以访问父亲中的保护内容
  3.private    私有权限  成员类内可以访问,类外不可以访问,儿子不可以访问父亲的私有内容*/

class Person 
{
public:
	//公共权限
	string m_Name;

protected:
	//保护权限
	string m_Cat;

private:
	//私有权限
	int m_Password;

//private:
public:
	void func() /*类内内容*/
	{
		m_Name = "张三";
		m_Cat = "拖拉机";
		m_Password = 123456;
	}
};
int main()
{
	//实例化具体对象
	Person p1;
	p1.m_Name = "李四";
	//p1.m_Car = "奔驰"; // 保护权限内容,类外访问不到
	//p1.m_Password = 123; //私有权限内容,类外也是访问不到
	//p1.func();
	p1.func();
	system("pause");
	return 0;
}

4. strunct和class的区别

在c++中struct和class唯一的区别在于默认的访问权限不同
区别:
struct 默认权限为公共
class  默认权限为私有
#include <iostream>
using namespace std;
/*在c++中struct和class唯一的区别在于默认的访问权限不同
区别:
    struct 默认权限为公共
	class  默认权限为私有*/

class c1
{
	//上面什么权限都不写

	int m_A;//默认权限为私有
};

struct c2
{
	int m_A;//默认权限为公共
};

int main()
{
	c1 c1;
	//c1.m_A = 100; //在class里默认权限为私有,因此不可以访问
	
	c2 c2;
	c2.m_A = 100; //在struct默认权限为公共,因此可以访问

	system("pause");
	return 0;
}

5.成员属性设置为私有

成员属性设置为私有
优点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;
	}

	//读(获取)年龄 
	//改为可读可写 如果想修改(年龄范围必须是0~150之间)
	int getAge()
	{
		//m_Age = 0;
		return m_Age;
	}

	//改为可读可写 如果想修改(年龄范围必须是0~150之间)
	//设置年龄
	void setAge(int age)
	{
		if (age < 0 || age>150)
		{
			m_Age = 0;
			cout << "您输入的年龄有误" << endl;
			return;
		}
		m_Age = age;
	}
	//写(设置)情人
	void setLover(string lover)
	{
		m_Lover=lover;
	}
private:
	//姓名 可读可写
	string m_Name;
	//年龄  只读
	int m_Age;
	//情人  只写
	string m_Lover;
};
int main()
{
	Person p;
	p.setName("张三");
	p.setLover("苍井");
	p.setAge(1800);
	cout << "姓名为:" << p.getName() << endl;
	cout << "年龄为:" << p.getAge() << endl;
	//cout << "情人为:" << p.getLover() << endl; 是不可以访问的
	//p.m_Name = "张三";
	
	system("pause");
	return 0;
}

6. 案例—设计立方体类

设计立方体类(Cube)
求出立方体的面积和体积
分别用全局函数和成员函数判断两个立方体是否相等
#include <iostream>
using namespace std;

/*设计立方体类(Cube)
  求出立方体的面积和体积
  分别用全局函数和成员函数判断两个立方体是否相等*/

/*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 (m_L == c.getL() && m_W == c.getW() && m_H == 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(11);

	//利用全局函数判断
	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;
}

7. 点和圆的关系

设计一个圆类(Circle),和一个点类(Point),计算点和圆的关系
点到圆心的距离 == 半径  点在圆上
点到圆心的距离 > 半径   点在圆外
点到圆心的距离 < 半径   点在圆内
#include <iostream>
using namespace std;

/*设计一个圆类(Circle),和一个点类(Point),计算点和圆的关系
  点到圆心的距离 == 半径  点在圆上
  点到圆心的距离 > 半径   点在圆外
  点到圆心的距离 < 半径   点在圆内*/
//点类
class Point
{
public:
	//设置x
	void setX(int x)
	{
		m_X = x;
	}
	//获取x
	int getX()
	{
		return m_X;
	}
	//设置y
	void setY(int y)
	{
		m_Y = y;
	}
	//获取y
	int 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++类与对象——封装 的相关文章

  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • 使用 CMake 时如何导出 Emscripten 中的 C 函数

    In 本教程 https emscripten org docs porting connecting cpp and javascript Interacting with code html interacting with code
  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • 前向声明类型和“已声明为类类型的非类类型”

    我对以下代码有问题 template
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • 在 C 中使用枚举而不是 #defines 作为编译时常量是否合理?

    在 C 工作了一段时间后 我将回到 C 开发领域 我已经意识到 在不必要的时候应该避免使用宏 以便让编译器在编译时为您做更多的工作 因此 对于常量值 在 C 中我将使用静态 const 变量或 C 11 枚举类来实现良好的作用域 在 C 中
  • 将函数参数类型提取为参数包

    这是一个后续问题 解包 元组以调用匹配的函数指针 https stackoverflow com questions 7858817 unpacking a tuple to call a matching function pointer
  • 如何最好地以编程方式将 `__attribute__ ((unused))` 应用于这些自动生成的对象?

    In my makefile我有以下目标 它将文本 HTML 资源 编译 为unsigned char数组使用xxd i http linuxcommand org man pages xxd1 html 我将结果包装在匿名命名空间和标头保
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我

随机推荐

  • 区间预测

    区间预测 MATLAB实现QRDNN深度神经网络分位数回归时间序列区间预测 目录 区间预测 MATLAB实现QRDNN深度神经网络分位数回归时间序列区间预测 效果一览 基本介绍 模型描述 程序设计 参考资料 效果一览 基本介绍 MATLAB
  • 基于正交试验的钢丝绳探伤仪结构参数优化

    目录 理论基础 比尔萨法定律 磁路欧姆定律 编辑 标题 摘要 结论 标题 摘要 结论 研究背景 大背景 小背景 研究内容 成果 内容 结论 成果 潜在研究点 疑问 理论基础 比尔萨法定律 磁路欧姆定律 标题 摘要 结论 标题 基于正交试验的
  • Celery(一)Celery介绍、安装和基本使用

    目录 1 Celery介绍 1 1 Celery是什么 1 2 架构图 2 安装 2 1 linux安装 2 2 windows安装 3 基本使用 3 1 启动worker 3 2 添加任务 3 4 扩展 3 3 停止worker 1 Ce
  • 前后端交互,修改密码校验

    1 思路分析 1 1 前端校验 1 gt 输入的原密码 新密码 确认密码 都不能为空 2 gt 原密码与新密码不能相同 3 gt 新密码与确认密码必须相同 1 2 后端校验 1 gt 后端接收前端发送的原密码和新密码 2 gt 验证输入的原
  • IDA静态逆向工具详解二

    文章目录 1 栈帧 2 调用约定 3 栈帧详解 1 栈帧 栈帧 stack frame 栈帧是在程序的运行时栈中分配的内存块 专门用于特定的函数调用 栈帧 激活记录 调用函数的详细步骤 2 1 调用方将被调用函数所需的参数放入到该函数所采用
  • 未定义标识符 "CV_CAP_PROP_FRAME_COUNT"

    我在这样一段代码 获取视频总帧数 long totalFrameNumber cap get CV CAP PROP FRAME COUNT cout lt lt totalFrameNumber lt lt endl 中 VS报了 未定义
  • 基于ssm的导师交流系统

    摘 要 导师交流是由高校考生与导师重要组成 高校考生导师交流是实施素质教育的重要途径和有效方式 在加强校园文化建设 提高考生综合素质 引导考生适应社会 促进考生成才就业等方面发挥着重要作用 是新形势下有效凝聚考生 开展思想政治教育的重要组织
  • collections.OrderedDict() 函数使用技巧

    Author Horizon Max 编程技巧篇 各种操作小结 机器视觉篇 会变魔术 OpenCV 深度学习篇 简单入门 PyTorch 神经网络篇 经典网络模型 算法篇 再忙也别忘了 LeetCode 文章目录 collections O
  • 二分查找法(折半查找法)及C语言实现

    折半查找 也称二分查找 在某些情况下相比于顺序查找 使用折半查找算法的效率更高 但是该算法的使用的前提是静态查找表中的数据必须是有序的 例如 在 5 21 13 19 37 75 56 64 88 80 92 这个查找表使用折半查找算法查找
  • C# 使用Linq联合SQL与Oracle查询的例子

    思路就是从SQL拿到本地的表 从Oracle拿到本地的表 用Linq连接本地的两张表 并做一些查询 private void QueryWithTiptop string sql SELECT jm Company jm JobNum jm
  • 关于大电容通低频电,小电容通高频电,大电容滤低频,小电容滤高频的问题解释

    由于正在学习STM32最小系统板的绘制 在学习设计STM32最小系统板的电源模块时 发现原理图在电源附近往往会并上一个10UF以及0 1UF的电容 于是产生了以上疑问 在查阅了大量解释之后 总结如下 一 关于大电容通低频电 小电容通高频电的
  • echarts里面的参数解释_echarts里 formatter的params传值问题

    题目描述 Echarts官方网站里K线图例子中 params 0 value 0 是第一个data值 但是当我把代码复制过去 params 0 value 0 就变成了data下标 而params 0 value 1 变成了第一个data值
  • 时间序列预测任务,预测值相对比真实值趋势滞后问题

    1 问题描述 我们在采用LSTM GRU等深度模型进行时间序列预测任务时 通常会采用滑动窗口策略 即将训练集和测试集划分为若干个滑动时间窗口 在每次训练迭代过程中 利用N个历史时间窗口的数据 x t N x t x t N x t xt N
  • 对java类进行初始化设置,默认设置String类型为空串““

    对java类进行初始化设置 默认设置String类型为空串 为了适应String转xml时 要求返回的空元素 填充处理空的xmlElement public void nullToStringValue Object obj try Cla
  • hive 字符串替换指定字符_字符串:替换空格

    给 代码随想录 一个星标吧 遇到对字符串或者数组做填充或删除的操作时 都要想想从后向前操作怎么样 题目 剑指Offer 05 替换空格 请实现一个函数 把字符串 s 中的每个空格替换成 20 示例 1 输入 s We are happy 输
  • 差分数组的使用

    一 问题 现在 输入一个数组 nums 然后又要求给区间 nums 2 6 全部加 1 再给 nums 3 9 全部减 3 再给 nums 0 4 全部加 2 再给 一通操作猛如虎 请问最后 nums 数组的值是什么 常规的思路很容易 你让
  • “华为杯”研究生数学建模竞赛2015年-【华为杯】B题:数据的多流形结构分析(续)

    目录 4 2 2 算法复杂度分析 4 2 3 参数影响 4 2 4 问题 3 a 求解 4 3 问题 3 b 4 3 1 加权稀疏子空间聚类
  • WEBGL入门

    1 uniform attribute和varying变量 想要将位置信息从javascript程序中传给顶点着色器 有两种方式可做到 attribute变量和uniform变量 attribute变量传输时那些与顶点相关的数据 unifo
  • js获取页面已选中的文字

    直接上代码 document selection createRange text IE9以下使用 window getSelection toString 其他浏览器使用 封装一下 function getSelectText retur
  • c++类与对象——封装

    1 封装的意义 类和对象 C 面对对象三大特性 封装 继承 多态 C 认为万事万物都皆为对象 对象上有其属性和行为 例如 人可以作为对象 属性有姓名 年龄 身高 行为有走 跑 吃饭 唱歌 车也可以作为对象 属性有轮胎 方向盘 行为有载入 放