当前位置: 首页 > news >正文

第一层:封装

文章目录

  • 前言
  • 类和对象
  • 封装
    • class
    • 权限
      • public
      • protected
      • private
    • struct和class的区别
    • 封装的好处
    • 封装的用法
  • 学完封装,突破第一层

🎉welcome🎉
✒️博主介绍:一名大一的智能制造专业学生,在学习C/C++的路上会越走越远,后面不定期更新有关C/C++语法,数据结构,算法,Linux,ue5使用,制作游戏的心得,和大家一起共同成长。
✈️C++专栏:C++爬塔日记
😘博客制作不易,👍点赞+⭐收藏+➕关注

前言

在一方神秘的土地上,有一座高耸入云的塔,叫做C++,经历了之前C语言对我的磨砺,我步入的这座神秘的古塔。

类和对象

进入这座古塔中,一段话浮现在我的脑海之中,C++面向对象有三大特性:封装、继承、多态,
同样,C++认为万事万物都可以为对象,对象具有属性和行为,比如,人可以作为对象,属性有姓名、年龄、身份证号、身高、体重,行为有跑步、吃饭、睡觉,那这些具有相同属性的对象,称为类,人属于人类,任何事物都有所属的类别。

封装

了解完这些我大为震撼,不愧是C++,这是有一道声音飘来,“挑战者,你今天的任务就是掌握封装的力量,封装可以隐藏事物实现的细节,对外提供访问方式,你若掌握成功此力量,便能突破这第一层。”声音散去,出现在眼前的只有一串的代码和注释…

class

代码的开始是一个class,它代表了这是一个类,只有先写上class,后面跟着类名,任何在大括号中写入我们这个类的权限、属性、行为便创建好了一个类,这个时候可以试着去创建一个学生类,属性有名字、学号,行为可以访问名字和学号。

#include<iostream>
using namespace std;
#include<string>

class student
{
	//属性
	string name;//名字
	string stunum;//学号
	//行为
	void print()
	{
		cout << "name: " << name<< endl;
		cout << "stunum: " << stunum << endl;
	}
};

权限

在class当中提到了一个概念,叫做权限,权限是封装比较重要的东西,它可以让不同的属性、行为的权限是不一样,权限分为三种:public、protected、private。

public

public是公共权限,它权限下的东西可以可以在类外进行访问,也可以在类内进行访问,类外类内,指的就是我们的class大括号,大括号内是类内,大括号外是类外,可以进行验证一下。

#include<iostream>
using namespace std;
#include<string>

class student
{
public:

	string name;
	string stunum;

	void print()
	{
		cout << "name: " << name<< endl;
		cout << "stunum: " << stunum << endl;
	}
};

int main()
{
	student s1;
	cin >> s1.name;
	cin >> s1.stunum;
	s1.print();
	return 0;
}

在这里插入图片描述
可以看到,程序成功的跑起来了,我们在类外也对类内的属性进行的修改,也能访问我们类内的行为。

protected

protected是保护权限,在该权限下的内容不可以在类外进行访问,但是可以在类内进行访问,同时,它可以让我们的“儿子”(继承中的概念)进行访问,同样可以试一下。

#include<iostream>
using namespace std;
#include<string>

//男人
class man
{
//保护权限
protected:
	string _name;//名字
	string _car;//车
	string _age;//年龄
};
int main()
{
	man m1;
	cout << m1._name << endl;

	return 0;
}

在这里插入图片描述在这里插入图片描述
可以看到是有报错的,报错原因也有,不可访问。

private

private是我们的私密权限,他和我们的protected对于类内类外的访问权限是不一样的,他们的区别在于,protected,它权限下的东西是可以让“儿子”访问的,但是private是不可以让我们的“儿子”访问的,如果类外访问,可以参考protected的报错。

struct和class的区别

根据学习结构体可以得知,struct的作用和class是基本一致的,访问类内成员的方式也是一样的,那它们两个根本的区别是什么?既然作用是基本一致的,为什么要分成两个?这里就是上面所讲的结构问题,对于我们的struct来说,如果类内不分权限的,它的默认权限是公共权限public,而class的默认权限是私有权限private,这里可以用代码的方式得出结论。

#include<iostream>
using namespace std;
#include<string>

//用结构体命名的学生1
struct stu1
{
	string _name;
};
//用类命名的学生2
class stu2
{
	string _name;
};

int mian()
{
	struct stu1 s1;
	stu2 s2;
	cin >> s1._name;
	cin >> s2._name;

	return 0;
}

在这里插入图片描述在这里插入图片描述
同样的是用默认权限,可以看到,struct的可以类外访问,而class的不能进行类外访问。

封装的好处

1封装可以隐藏我们实现的细节
2.可以提高我们代码的安全性

对于封装而言,可以让程序员自己分配我们类内属性和行为的权限,更加安全,同时可以隐藏掉一些我们实现动作时候的细节。

封装的用法

封装的作用不仅仅是我们表面上看到的那么简单,我们可以让类的属性私有化,如何对外留有访问方式,我们可以决定类外对于这个属性的行为,可以是可读可写,也可以是只读不写,只要是我们想,那就可以去实现,比如现在可以实现个案例,如下图:
在这里插入图片描述
去实现一个男人类,他有三个属性,姓名,汽车,妻子,其中姓名和汽车是可以让人知道的,但是不能让每个人都访问,属于保护权限,妻子属于自己一个人的,谁都不能去占用,属于私有权限,同时需要留出接口用于访问类内的元素。

#include<iostream>
using namespace std;
#include<string>

//男人类
class man
{
//公共权限,对外留的访问接口
public:

	//对名字进行写入
	void get_name(string s1)
	{
		_name = s1;
	}

	//对名字进行读出
	string read_name()
	{
		return _name;
	}

	//对于汽车进行写入
	void get_car(string car)
	{
		_car = car;
	}

	//对妻子进行写入
	void get_wife(string wife)
	{
		_wife = wife;
	}

//保护权限,“儿子”可以访问
protected:
	string _name;//名字
	string _car;//汽车
//私有权限,“儿子”不可以访问,只有自己可以访问
private:
	string _wife;//妻子
};

int main()
{
	man m1;
	m1.get_name("狗蛋");
	m1.get_car("劳斯莱斯幻影");
	m1.get_wife("翠花");
	cout << "这个男人的名字叫:" << m1.read_name() << endl;
	return 0;
}

在这里插入图片描述
通过运行结果只能看出,“狗蛋”的名字是写入进去了,那其他的呢?可以通过调试的窗口看出。
在这里插入图片描述
通过调试可以看出,我们的写入很成功,这也是封装最基本的用法。

学完封装,突破第一层

看完面前石板的内容,经过了我孜孜不倦的学习,终于掌握了封装的力量,“少年人,你很不错,上第二层去吧。”…

😘预知后事如何,关注新专栏,和我一起征服C++这座巨塔
🚀专栏:C++爬塔日记
🙉都看到这里了,留下你们的👍点赞+⭐收藏+📋评论吧🙉

相关文章:

  • 【BP靶场portswigger-客户端14】点击劫持-5个实验(全)
  • 【PaaS】分享一家最近发现的宝藏Paas厂家
  • C语言—基于realloc函数实现的通讯录
  • 【云原生】k8s 一键部署(ansible)
  • Java使用Zxing二维码生成
  • C++程序卡死、UI界面卡顿问题的原因分析与总结
  • 【C语言进阶】使用“动态内存文件处理”实现进阶版通讯录
  • 我们怎样才能过好这一生?
  • C 语言目标文件
  • 你是真的“C”——函数递归详解汉诺塔+青蛙跳台阶
  • Docker部署Nexus通过Maven推送及拉取代码
  • C语言学习——字符函数和字符串函数
  • 微信小程序登陆,后端接口实现 - springboot
  • 【论文精读】Scaling distributed machine learning with the parameter server
  • 【JavaEE】多线程之线程安全(synchronized篇),死锁问题
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • @angular/forms 源码解析之双向绑定
  • [nginx文档翻译系列] 控制nginx
  • 《剑指offer》分解让复杂问题更简单
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • codis proxy处理流程
  • ECS应用管理最佳实践
  • JavaScript创建对象的四种方式
  • JavaScript中的对象个人分享
  • OSS Web直传 (文件图片)
  • python学习笔记-类对象的信息
  • TCP拥塞控制
  • 阿里云购买磁盘后挂载
  • 从零开始在ubuntu上搭建node开发环境
  • 搞机器学习要哪些技能
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 技术发展面试
  • 你不可错过的前端面试题(一)
  • 前端工程化(Gulp、Webpack)-webpack
  • 实现菜单下拉伸展折叠效果demo
  • 实战|智能家居行业移动应用性能分析
  • 使用common-codec进行md5加密
  • 双管齐下,VMware的容器新战略
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 我有几个粽子,和一个故事
  • 正则表达式
  • 阿里云重庆大学大数据训练营落地分享
  • (1)(1.9) MSP (version 4.2)
  • (Git) gitignore基础使用
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • ******之网络***——物理***
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net 7 上传文件踩坑
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET delegate 委托 、 Event 事件
  • .php文件都打不开,打不开php文件怎么办
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)