新旅程:类与对象的魔法课堂

news2024/11/15 17:45:58

🎉🎉🎉欢迎莅临我的博客空间,我是池央,一个对C++和数据结构怀有无限热忱的探索者。🙌
🌸🌸🌸这里是我分享C/C++编程、数据结构应用的乐园✨
🎈🎈🎈期待与你一同在编程的海洋中遨游,探索未知的技术奥秘💞

📝专栏指路:

📘【C++】专栏:深入解析C++的奥秘,分享编程技巧与实践。
📘【数据结构】专栏:探索数据结构的魅力,助你提升编程能力。

8345dda4516e46e1b64192fac99cd278.gif

读者哥哥,姐姐是好人~

来和可莉一起学习吧~

1.面向过程和面向对象初步认识

1.1C语言是面向过程

关注的是 过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
就拿洗衣服举例:洗好衣服要经过下面几个过程
86a973dc74bc44a8a977c86e31471f2d.png

 

1.2C++是基于面向对象

关注的是 对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
在C++中洗衣服这件事是被这样看待的:
 
对象:人、衣服、洗衣粉、洗衣机
 

整个洗衣服的过程:人将衣服放进洗衣机、倒入洗衣粉,启动洗衣机,洗衣机就会完成洗衣过程并且甩干

整个过程主要是:人、衣服、洗衣粉、洗衣机四个对象之间交互完成的,人不需要关新洗衣机具体是如何洗衣服的,是如何甩干的

5e75ce8ebeb84fcdaec80678f287743f.png

 

2.类的引入

在C语言中, struct结构体类型中,只能 定义变量;C++兼容C中struct的用法,在此基础上C++在结构体内部还可以 定义函数,也可以 嵌套定义结构体,C++升级struct成了类,而在C++中类更喜欢用关键字 class
  • 类:在编程中,类是一个模板或蓝图,它描述了具有相同属性和方法的对象的集合。简单来说,类就是定义对象的模板。
  • 对象:对象是类的实例。当你使用类来创建一个新的实体时,你就创建了一个对象。这个对象具有类定义的属性和方法。

3.类的定义

class className
{
// 类体:由成员函数和成员变量组成
};  // 一定要注意后面的分号
(1)ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分 号不能省略。
 
(2)类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者
成员函数。
 
(3)类的两种定义方式:
1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内
联函数处理。(想了解更多与内联函数有关的请点击: 内联函数)
示例:
f0582d84af224e5b9822d8ef49675553.png
 
2. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::
示例:
1935024a579e45dcbd626206e14eb26c.png

 

4.类的访问限定符及封装

C++中为了更好的保护数据,在C语言的基础上设置了三个访问限定符(只在编译时有用)
01b5975663eb481dacce2435ca6a44d1.png

4.1访问限定符说明

 
(1)public可让类内部的变量或成员函数在类外直接被访问
 
(2)protected和private则会保护类内部的变量或者函数使它们不能被直接访问,从而提高了数据的安全性(此处protected和private是类似的)
 
(3)C语言的struct内部定义的变量都被默认为public(因为没有访问限定符),而在C++中class内部的成员如果没有写访问限定符都被认为是private的,而struct被默认为public(因为struct要兼容C )
 
(4)访问权限 作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止 ,如果后面没有访问限定符,作用域就到   }    即类结束。

4.2封装

面向对象的三大特性:封装、继承、多态。

在类和对象阶段,主要是研究类的封装特性,那什么是封装呢?
 
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来 和对象进行交互。
封装本质上是一种管理,让用户更方便使用类。比如:对于电脑这样一个复杂的设备,提供给用户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互,完成日常事务。但实际上电脑真正工作的却是CPU、显卡、内存等一些硬件元件。
在C++语言中实现封装,可以 通过类将数据以及操作数据的方法进行有机结合,通过访问权限来
隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用

 

5.类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中 在类体外定义成员时,需要使用 ::
作用域操作符指明成员属于哪个类域。
示例:
687c0a8eea9b4c64927eb321def3da37.png
如图,我们定义了一个叫Person的类,void PrintPersonInfo();是类成员函数的声明,而此成员
函数的定义超出了类的作用域(也就是在类的外面),要让在类外面的函数属于类必须加上在函数
类型后面加上Person::(在类域外面不加Person::就好比小区里面的野狗没有主人;而加了Person::的是有主人的狗,受主人管控)

6.类的实例化

类的实例化是用类类型创建对象的过程
 
(1)一个类可以有多个对象(一夫多妻制)
 
(2)定义类时并没有分配实际内存空间来存储
 
(3)实例化出的对象才会占用实际内存空间,存储类成员变量(也就是对象占有空间的对象),需要注意并吧存储成员函数。原因如下:
调用成员函数的地址都相同,为了不浪费空间, 代码只保存一份, 成员函数的占用的内存空间在公共代码区
 
(4)空类占一个字节大小,不存储有效数据,只标识着对象被定义出来
 

(5)类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

0d55bd55c3a348188ee4f7a20a94c3e0.png


7.类成员函数的this指针

7.1this指针作用

隐藏指针参数, 该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作都通过该指针访问。
注意:this指针并不需我们去定义,他是编译器自动生成的

7.2this指针特性

(1)类型: 类类型const*,成员函数中,不能给this指针赋值
(2)只能在“成员函数"内部使用
(3)本质:“成员函数"的形参,当对象调用“成员函数"时将对象地址作实参传给形参this,所以对象中不存储this指针
(4)不需要用户传,一般存储在栈/寄存器ecx中
7142ce8c1a864700b3a7d7a14c76cc11.png
(5)this指针的应用
 
初步
85e7dc9bff6e44a087bae1b2aa6b2a23.jpeg
进阶
#include<iostream>
using namespace std;
//定义一个类对象
class Date
{
//成员变量(私有)
private:
	int year, month, day;
//公有
public:
//析构函数
	Date(int y = 0, int m = 0, int d = 0) :
		year(y), month(m), day(d){;}
//获取月份具体天数函数
	int GetMonthDay(int year,int month)
	{
		int MonthDay[13] = { -1,31,28,31,30,31,30,31,31,30,31,30,31 };
		if (month == 2 && (year % 4 == 0 && year % 100 != 0 || year % 400 == 0))
		{
			return 29;
		}
		return MonthDay[month];
	}
//显示日期函数
	void show()
	{
		cout << year << "/" << month << "/" << day << endl;
	}
//运算符重载
	Date& operator<(Date& d);//日期比较大小
	Date& operator++();//++日期
	friend bool operator==(Date& d1, Date& d2);//判断两个日期是否相等
};
Date& Date::operator<(Date& d)
{
	if (year < d.year)
	{
		return *this;//返回原本对象
	}
	else if (year > d.year)
	{
		return d;//返回另外一个对象
	}
	else
	{
		if (month < d.month)
		{
			return *this;
		}
		else if (month > d.month)
		{
			return d;
		}
		else
		{
			if (day < d.day)
			{
				return *this;
			}
			else
			{
				return d;
			}
		}

	}
}
Date& Date::operator++()
{
	day++;
	if (day > GetMonthDay(year, month))
	{
		day = 1;
		month++;
		if (month == 13)
		{
			month = 1;
			year++;
		}
	}
	return *this;
}
bool operator==(Date& d1, Date& d2)
{
	if(d1.year==d2.year)
	{ 
		if (d1.month == d2.month)
		{
			if (d1.day == d2.day)
			{
				return true;
			}
			else
			{
				return false;
			}
		}
		else
		{
			return false;
		}
	}
	else
	{
		return false;
	}
}
int main()
{
	Date d1(2024, 5, 22), d2(2024, 3, 24),d3;
	d3 = d1 < d2;
	d3.show();
	bool ret = d1 == d2;
	cout << "两个日期相同吗(相同为1,不同为0)" << endl;
	cout << "两个日期:" << ret << endl;
	Date d4(2024, 12, 31),d5;
	++d4;
	d4.show();
}

 

 
 
 

 

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

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

相关文章

AI大模型在测试中的深度应用与实践案例

文章目录 1. 示例项目背景2. 环境准备3. 代码实现3.1. 自动生成测试用例3.2. 自动化测试脚本3.3. 性能测试3.4. 结果分析 4. 进一步深入4.1. 集成CI/CD管道4.1.1 Jenkins示例 4.2. 详细的负载测试和性能监控4.2.1 Locust示例 4.3. 测试结果分析与报告 5. 进一步集成和优化5.1. …

RK3588 camera驱动总结二之图像格式

camera驱动中很重要的一个设置就是格式&#xff0c;此文来看看这块。 在驱动中有个重要的参数mbus-code&#xff0c;即Media Bus Pixel Codes&#xff0c;它描述的是用于在物理总线上传输的格式&#xff0c;比如 sensor 通过mipi dphy 向 isp 传输的图像格式&#xff0c;或者在…

AI预测体彩排3采取888=3策略+和值012路一缩定乾坤测试5月28日预测第4弹

今天继续基于8883的大底进行测试&#xff0c;今天继续测试&#xff0c;好了&#xff0c;直接上结果吧~ 首先&#xff0c;888定位如下&#xff1a; 百位&#xff1a;3,4,2,5,0,7,8,9 十位&#xff1a;3,2,4,1,6,7,8,9 个位&#xff1a;0,1,2,3,4,5,6,7 …

如果你使用vscode的ssh插件远程连接不了服务器,解决办法如下

CtrlShiftP打开命令面板&#xff0c;在命令面板中输入setting&#xff0c;选择User Settings 在页面中配置"remote.SSH.useLocalServer": true,保存重启后再重新连接就好了 再次连接就可以输入密码连接了

YOLOv5改进 | 卷积模块 | 提高网络的灵活性和表征能力的动态卷积【附代码+小白可上手】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 轻量级卷积神经网络由于其低计算预算限制了CNNs的深度&#xff08;卷积层数&#xff09;和宽度&#xff08;通道数&#xff09;&#xff0c;…

手机号码携号转网查询保障用户权益、信息透明、优化用户体验

携号转网服务是指在同一本地网范围内&#xff0c;蜂窝移动通信用户&#xff08;不含物联网用户&#xff09;变更签约的基础电信业务经营者而用户号码保持不变的一项服务。近年来&#xff0c;随着通信行业的不断发展&#xff0c;携号转网服务已成为满足用户个性化需求、提升服务…

使用nexus搭建的nodejs私库,定期清理无用的npm组件,彻底释放磁盘空间

一、背景 昨天我们整理了一篇关于docker私库&#xff0c;如何定期清理以释放磁盘空间的文章。 虽然也提及了npm前端应用的组件该如何定期清理的&#xff0c;本文是对它作一个补充说明。 前文也看到了&#xff0c;npm组件占用的blob空间为180多GB&#xff0c;急需清理。 二、…

给pdf加水印,python实现

from PyPDF2 import PdfReader, PdfWriterdef add_watermark(pdf_file_in, pdf_file_mark, pdf_file_out):"""把水印添加到pdf中"""pdf_output PdfWriter()input_stream open(pdf_file_in, rb)pdf_input PdfReader(input_stream, strictFalse…

111.二叉树的最小深度

给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。 示例: 给定二叉树 [3,9,20,null,null,15,7], 返回它的最小深度 2. 思路&#xff1a; 后序遍历&#xff08;左右中&#xff…

Mybatis预编译

想要看到sql语句有没有执行, 可以用过日志去查看 在properties中打开 使用 stdout 是向控制台输出 #日志开启,sql ,mybatis mybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl

【Beyond Compare】专业的文件对比工具

一、Beyond Compare官方下载 二、Beyond Compare简介 三、Beyond Compare 4激活 一、Beyond Compare官方下载 Beyond Compare官方下载https://www.beyondcompare.cc/ Beyond Compare 4中文包 链接&#xff1a;https://pan.baidu.com/s/14igdUm0Xy7DFp4Jzb58AZg?pwdGLNG 提取码…

Clickhouse MergeTree 存储引擎架构总结——Clickhouse 架构篇(二)

文章目录 前言MergeTree存储引擎的三大特点MergeTree 的数据组织MergeTree的文件组织数据文件、元数据文件、索引文件和其他文件分区数据库和表 索引与事务数据库存储引擎的对比存储引擎如何影响查询速度MergeTree存储引擎的工作过程 前言 存储引擎是ClickHouse非常重要的一个…

CSS(七)

文章目录 CSS&#xff08;七&#xff09;1. 精灵图&#xff08;重点&#xff09;1.1 为什么需要精灵图1.2 精灵图&#xff08;sprites&#xff09;的使用1.3 案例&#xff1a;拼出自己名字1.3.1 案例效果1.3.2 代码参考 2. 字体图标2.1 字体图标的产生2.2 字体图标的优点**2.3*…

2951. 找出峰值

找出数组中的峰值 给你一个下标从 0 开始的数组 mountain 。你的任务是找出数组 mountain 中的所有 峰值。 以数组形式返回给定数组中 峰值 的下标&#xff0c;顺序不限 。 注意 峰值 是指一个严格大于其相邻元素的元素。数组的第一个和最后一个元素 不 是峰值。 示例 1 …

当下sprign boot最火最全的经典面试题

基础概念 什么是Spring Boot&#xff1f;Spring Boot的核心优势是什么&#xff1f;Spring Boot与传统的Spring MVC项目相比&#xff0c;有哪些显著的区别&#xff1f;Spring Boot如何实现“约定优于配置”原则&#xff1f;请举例说明。解释Spring Boot中的Starter POMs概念及其…

创建你的RedTeam基础架构

随着RedTeaming行业的发展&#xff0c;我们对构建可靠环境的需求也越来越高。至关重要的是要拥有维护健壮的基础架构的能力&#xff0c;该基础架构要保证一旦出现问题就可以重新创建&#xff0c;更重要的是&#xff0c;我们需要确保环境在部署时不会出现问题。 今天&#xff0c…

git@gitee.com: Permission denied (publickey)

1、报错信息 $ git clone gitgitee.com:你的用户名/项目名.git Cloning into 项目名... gitgitee.com: Permission denied (publickey). fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository exists.、 2、…

Unity 权限 之 Android 【权限 动态申请】功能的简单封装

Unity 权限 之 Android 【权限 动态申请】功能的简单封装 目录 Unity 权限 之 Android 【权限 动态申请】功能的简单封装 一、简单介绍 二、Android 权限 动态申请 三、实现原理 四、注意事项 五、案例实现简单步骤 附录&#xff1a; 一、进一步优化 二、多个权限申请…

AI日报|苹果将在iOS 18中引入ChatGPT,联想或成AI PC最大受益者

文章推荐 AI日报&#xff5c;阿里8亿美元购入月之暗面36%股份&#xff0c;Meta首席杨立昆建议不要研究大模型 阿里通义降价&#xff0c;百度文心免费&#xff0c;一图对比谁是最具性价比大模型&#xff1f; 苹果与OpenAI达成协议&#xff1a;将在iOS 18中提供ChatGPT聊天机器…

服务器数据恢复—EVA存储异常断电重启后虚拟机无法启动如何恢复数据?

服务器存储数据恢复环境&#xff1a; 某品牌EVA8400&#xff0c;服务器上安装VMware ESXi虚拟化平台&#xff0c;虚拟机的虚拟磁盘包括数据盘&#xff08;精简模式&#xff09;快照数据盘&#xff0c;部分虚拟机中运行oracle数据库和mysql数据库。 服务器存储故障&检测&…