[C++ 核心编程]笔记 4.1 封装

news2024/11/28 13:25:55

4.1.1 封装的意义

封装是C++面向对象三大特性之一


封装的意义:

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

封装意义一:

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

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

实例1: 求圆的周长

#include<iostream>
using namespace std;

//设计一个圆类, 求圆的周长

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 << "\t学号" << m_Id << endl;

	}
	//给姓名赋值
	void setName(string name,int n)
	{
		m_Name = name;
		m_Id = n;
	}
};



int main()
{
	//实例化
	Student s1,s2;
	//给s1对象赋值
	s1.setName("张三",1);

	s2.m_Name = "李四";
	s2.m_Id = 2;
	//显示学生信息
	s1.showStudent();
	s2.showStudent();

	system("pause");
	return 0;
}

封装意义二:

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

访问权限有三种:

  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_Car;

private:
	int m_Password;//银行卡密码


public:
	void func() {
		m_Name = "张三";
		m_Car = "拖拉机";
		m_Password = 123456;
	}
};

int main()
{
	//实例化具体对象
	Person p1;
	p1.m_Name = "李四";
	p1.Car = "奔驰";//保护权限内容,类外无法访问
	p1.m_Password = 123;//私有权限内容, 类外无法访问 



	system("pause");
	return 0;
}

4.1.2 struct和class的区别

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

  • struct 默认权限为公共
  • class 默认权限为私有
#include<iostream>
using namespace std;

class C1
{
	int m_A;//默认私有
};
struct C2
{
	int m_A;//默认共有
};


int main()
{
	//struct 默认权限为公共
	//class 默认权限为私有
	C1 c1;
	cl.m_A = 100;
	C2 c2;
	c2.m_A = 100;


	system("pause");
	return 0;
}

可以看到, 在类or结构体外:

  • c1报错, 无法访问, 是private权限
  • c2可以正常运行, 是public权限

在这里插入图片描述


4.1.3 成员属性设置为私有

优点1:将所有成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性

#include<iostream>
using namespace std;
/*4.1.3 成员属性设置为私有
优点1:将所有成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性*/

//人类
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 << "年龄"<<age<< " 输入有误, 赋值失败" << endl;
			return;
		}
		m_Age= age;
	}

	//设置偶像
	void setIdol(string idol)
	{
		m_Idol = idol;
	}
private:
	string m_Name;//可读可写

	int m_Age =18;//只读		也可以写(年龄必须在0-150)

	string m_Idol;//只写
};

int main()
{
	Person p;
	//姓名设置
	p.setName("张三");
	cout << "姓名: " << p.getName() << endl;

	//年龄设置
	p.setAge(160);
	//获取年龄
	cout << "年龄: " << p.getAge() << endl;

	//偶像设置
	p.setIdol("坤哥");
	//cout << "偶像: " << p.getIdol() << endl;//只写, 外界无法访问


	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述

可以看到检测到年龄160不符合要求


4.1.4 类和对象 - 案例1:

设计立方体类(Cube)

  1. 求出立方体的面积和体积
  2. 分别用全局函数和成员函数判断两个立方体是否相等。

设计方法:

  1. 创建立方体类
  2. 设计属性
  3. 设计行为 求立方体面积和体积
  4. 分别用全局和成员函数 判断立方体是否相等
#include<iostream>
using namespace std;



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 + m_L * m_H + m_W * m_H);
	}
	//获取立方体体积
	int calculateV()
	{
		return m_H * m_L * m_W;
	}

	//利用成员函数判断两个立方体是否相等
	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.getH() == c2.getH() && c1.getL() == c2.getL() && c1.getW() == c2.getW())
		return true;
	return false;
}


int main()
{
	Cube c1;
	c1.setL(10);
	c1.setH(10);
	c1.setW(10);

	cout << "c1的面积为: " << c1.calculateS() << endl;
	cout << "c1的体积为: " << c1.calculateV() << endl;
	
	//创建立方体c2
	Cube c2;
	c2.setL(10);
	c2.setH(10);
	c2.setW(10);

	cout << "c2的面积为: " << c2.calculateS() << endl;
	cout << "c2的体积为: " << c2.calculateV() << endl;

	//利用全局函数判断
	bool ret = isSame(c1, c2);//注意不要漏数据类型
	if (ret == true)
		cout << "立方体完全相等" << endl;
	else
		cout << "立方体不完全相等" << endl;

	//利用成员函数判断
	ret = c1.isSameByClass(c2);
	if (ret == true)
		cout << "成员函数判断: 立方体完全相等" << endl;
	else
		cout << "成员函数判断: 立方体不完全相等" << endl;
	system("pause");
	return 0;
}

运行结果如下:
在这里插入图片描述
设计完成


4.1.5 类和对象 - 案例2:

设计立方体类(Cube)

  1. 求出立方体的面积和体积
  2. 分别用全局函数和成员函数判断两个立方体是否相等。

设计方法:

  1. 创建立方体类
  2. 设计属性
  3. 设计行为 求立方体面积和体积
  4. 分别用全局和成员函数 判断立方体是否相等
#include<iostream>
using namespace std;



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 + m_L * m_H + m_W * m_H);
	}
	//获取立方体体积
	int calculateV()
	{
		return m_H * m_L * m_W;
	}

	//利用成员函数判断两个立方体是否相等
	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.getH() == c2.getH() && c1.getL() == c2.getL() && c1.getW() == c2.getW())
		return true;
	return false;
}


int main()
{
	Cube c1;
	c1.setL(10);
	c1.setH(10);
	c1.setW(10);

	cout << "c1的面积为: " << c1.calculateS() << endl;
	cout << "c1的体积为: " << c1.calculateV() << endl;
	
	//创建立方体c2
	Cube c2;
	c2.setL(10);
	c2.setH(10);
	c2.setW(10);

	cout << "c2的面积为: " << c2.calculateS() << endl;
	cout << "c2的体积为: " << c2.calculateV() << endl;

	//利用全局函数判断
	bool ret = isSame(c1, c2);//注意不要漏数据类型
	if (ret == true)
		cout << "立方体完全相等" << endl;
	else
		cout << "立方体不完全相等" << endl;

	//利用成员函数判断
	ret = c1.isSameByClass(c2);
	if (ret == true)
		cout << "成员函数判断: 立方体完全相等" << endl;
	else
		cout << "成员函数判断: 立方体不完全相等" << endl;
	system("pause");
	return 0;
}

运行结果如下:
在这里插入图片描述
设计完成

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

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

相关文章

基于Qt实现的自定义树结构容器:设计与应用

在Qt框架中&#xff0c;尽管其提供了许多强大的容器类&#xff08;如 QList, QMap, QTreeWidget 等&#xff09;&#xff0c;但缺少一个通用的、灵活的树结构容器&#xff0c;直接支持多层级数据管理。为了满足这些需求&#xff0c;本文设计并实现了一个可复用的自定义树结构容…

Web登录页面设计

记录第一个前端界面&#xff0c;暑假期间写的&#xff0c;用了Lottie动画和canvas标签做动画&#xff0c;登录和注册也连接了数据库。 图片是从网上找的&#xff0c;如有侵权私信我删除&#xff0c;谢谢啦~

钟睒睒的“傲慢与偏见”

文章内容根据网络内容整理形成 最近&#xff0c;钟睒睒关于绿瓶水不适合长期饮用的言论&#xff0c;在网上引起了一番新的热议&#xff0c;让刚平静不久的包装饮用水竞争&#xff0c;再次掀起一阵波澜&#xff0c;同时&#xff0c;其对于企业家直播带货的等系列看法&#xff0c…

【ArcGISPro】使用AI提取要素-土地分类(sentinel2)

Sentinel2数据处理 【ArcGISPro】Sentinel-2数据处理-CSDN博客 土地覆盖类型分类 处理结果

【技术文档:技术传播的灯塔】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Qt-系统相关(2)多线程网络

Qt多线程 在 Qt 中&#xff0c;多线程的处理⼀般是通过 QThread类 来实现。 QThread 代表⼀个在应⽤程序中可以独⽴控制的线程&#xff0c;也可以和进程中的其他线程共享数据。 QThread 对象管理程序中的⼀个控制线程。 QThread 常⽤ API&#xff1a; 使用线程 关于创建线程…

永久免费使用最好的Markdown编辑器——Typora

介绍 Typora 是一款轻量级的 Markdown 编辑器&#xff0c;其最为出众的特点是&#xff1a; 所见即所得。 Typora 于2021年11月23日推出了第一个正式版&#xff0c;并转为收费。不过价格也算合理&#xff0c;89元/3台设备&#xff0c;为一次买断制。 直到2022年年中&#xff0…

Linux环境实现c语言编程

Linux环境实现c语言编程 准备工作 准备一台Linux虚拟机/机器 操作流程 打开Linux机器 打开终端 查看是否有GCC编译器 GCC是什么 GCC是GNU编译器集合&#xff08;GNU Compiler Collection&#xff09;的简称。它是一套免费的开源编程语言编译器&#xff0c;支持多种编程语…

VTK中对于相机camera的设置

1. 相机的核心属性 在 VTK 中&#xff0c;vtkCamera 的核心属性有默认值。如果你不设置这些属性&#xff0c;相机会使用默认值来渲染场景。 Position&#xff08;默认值&#xff1a;(0, 0, 1)&#xff09;&#xff1a; 默认情况下&#xff0c;相机位于 Z 轴正方向的 (0, 0, 1)…

glog在vs2022 hello world中使用

准备工作 设置dns为阿里云dns 223.5.5.5&#xff0c;下载cmake&#xff0c;vs2022&#xff0c;git git clone https://github.com/google/glog.git cd glog mkdir build cd build cmake .. 拷贝文件 新建hello world并设置 设置预处理器增加GLOG_USE_GLOG_EXPORT;GLOG_NO_AB…

Python开发环境搭建+conda管理环境

下载Miniconda 推荐从清华镜像下载安装包 Index of /anaconda/miniconda/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 打开网页后&#xff0c;下拉到最后找到Miniconda3-latest前缀的文件&#xff0c;或者网页中直接搜索Miniconda3-latest&#xff0c;都可以找…

深度学习:GPT-2的MindSpore实践

GPT-2简介 GPT-2是一个由OpenAI于2019年提出的自回归语言模型。与GPT-1相比&#xff0c;仍基于Transformer Decoder架构&#xff0c;但是做出了一定改进。 模型规格上&#xff1a; GPT-1有117M参数&#xff0c;为下游微调任务提供预训练模型。 GPT-2显著增加了模型规模&…

C++设计模式-策略模式-StrategyMethod

动机&#xff08;Motivation&#xff09; 在软件构建过程中&#xff0c;某些对象使用的算法可能多种多样&#xff0c;经常改变&#xff0c;如果将这些算法都编码到对象中&#xff0c;将会使对象变得异常复杂&#xff1b;而且有时候支持不使用的算法也是一个性能负担。 如何在运…

Harbor安装、HTTPS配置、修改端口后不可访问?

Harbor安装、HTTPS配置、修改端口后不可访问&#xff1f; 大家好&#xff0c;我是秋意零。今天分享Harbor相关内容&#xff0c;安装部分可完全参考官方文档&#xff0c;写的也比较详细。 安装Harbor 官方文档&#xff1a;https://goharbor.io/docs/2.12.0/install-config/ …

DMS2024|思腾合力受邀参加第二届CCF数字医学大会

随着人工智能技术的不断进步&#xff0c;其在医学领域的应用日益广泛。从医学影像分析、疾病诊断到个性化治疗方案设计&#xff0c;人工智能正在逐步改变传统的医疗模式。未来&#xff0c;数字医学将更加注重数据的整合与挖掘&#xff0c;推动医学研究的深入与创新。 2024年11…

Python 绘制 向量减法

Python 绘制 向量减法 flyfish import matplotlib.pyplot as plt# 向量数据 a [1, 2] b [3, 2]# 计算-a 和 a-b minus_b [-x for x in b] # 反转向量b得到-b a_minus_b [a[i] minus_b[i] for i in range(2)] # 计算a - b# 绘制原点 plt.plot([0], [0], ko) # 黑色圆点…

工作坊报名|使用 TEN 与 Azure,探索你的多模态交互新场景

GPT-4o Realtime API 发布&#xff0c;语音 AI 技术正在进入一场新的爆发。语音AI技术的实时语音和视觉互动能力将为我们带来更多全新创意和应用场景。 实时音频交互&#xff1a; 允许应用程序实时接收并响应语音和文本输入。自然语音生成&#xff1a; 减少 AI 技术生成的语音…

node.js基础学习-http模块-创建HTTP服务器、客户端(一)

http模块式Node.js内置的模块&#xff0c;用于创建和管理HTTP服务器。Node.js使用JavaScript实现&#xff0c;因此性能更好。 使用http模块创建服务器&#xff0c;我们建议使用commonjs模块规范&#xff0c;因为很多第三方的组件都使用了这种规范。当然es6写法也支持。 下面就是…

黑马程序员Java项目实战《苍穹外卖》Day01

苍穹外卖-day01 课程内容 软件开发整体介绍苍穹外卖项目介绍开发环境搭建导入接口文档Swagger 项目整体效果展示&#xff1a; ​ 管理端-外卖商家使用 ​ 用户端-点餐用户使用 当我们完成该项目的学习&#xff0c;可以培养以下能力&#xff1a; 1. 软件开发整体介绍 作为一…

【NOIP普及组】表达式求值

【NOIP普及组】表达式求值 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 给定一个只包含加法和乘法的算术表达式&#xff0c;请你编程计算表达式的值。 输入 输入仅有一行&#xff0c;为需要你计算的…