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

🎉🎉🎉欢迎莅临我的博客空间,我是池央,一个对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();
}

 

 
 
 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

聚会活跃气氛神器小程序源码系统 各种小游戏 让聚会不再冷场 带源代码包以及安装搭建教程

系统概述 在社交聚会中&#xff0c;如何让气氛活跃起来一直是一个让人关注的问题。小编给大家分享一款聚会活跃气氛神器小程序源码系统。它不仅提供了丰富多样的小游戏&#xff0c;还带有源代码包和详细的安装搭建教程&#xff0c;让你轻松打造属于自己的聚会互动平台。 代码…

根据经纬度点计算经纬度点之间的距离

根据经纬度点计算经纬度点之间的距离 根据两点经纬度坐标计算直线距离 根据经纬度点计算经纬度点之间的距离 根据经纬度计算两地之间的距离 根据两点经纬度坐标计算距离 其实看第一个就够了 根据 半正矢公式&#xff08;Haversine formula&#xff09;即可计算 本计算式选取地…

【Django】开发个人博客系统【1】

使用Django开发个人博客系统&#xff0c;博客系统包括用户&#xff08;博主&#xff09;注册和登录、博主资料信息、图片墙功能、留言板功能、文章列表、文章正文内容和Admin后台系统。 1. 项目架构设计 下一步将上述设置写入Django的配置文件settings.py&#xff0c;当Django…

【C语言编程】Codeblocks安装步骤

操作系统 Windows 11 操作系统 安装步骤 1、 访问Codeblocks官网&#xff1a;Codeblocks官网&#xff0c;点击Download下载&#xff1a; 下载好的安装包&#xff1a; 2、 右键——以管理员身份运行&#xff1a; 3、 点击Next下一步&#xff1a; 4、 点击I Agree同意用…

解锁数据关联之道:SQL 表连接详解

文章目录 概述表关系横向连接内连接 inner join左连接 left join右连接 right join全连接 full join交叉连接 cross join 纵向合并UNION ALLUNION 概述 在数据处理、数据分析中常会用到表连接。表连接的作用是将多个表中的数据关联起来&#xff0c;以便在查询过程中获取更全面…

【LabVIEW FPGA入门】使用事件发生函数同步FPGA循环

1.使用事件发生函数 使用 Occurrences 函数来控制单独的同步活动。特别是&#xff0c;当您希望程序框图的一部分等待程序框图的另一部分完成任务而不强制 LabVIEW 进行轮询时&#xff0c;请使用这些函数。 您可以使用全局变量执行类似于occurrences函数的功能&#xff0c;通过一…

通过Windows事件日志介绍APT-Hunter

APT-Hunter是用于Windows事件日志的威胁搜寻工具&#xff0c;该工具能够检测隐藏在Windows事件日志中的APT运动&#xff0c;如果您是弄威胁情报的人&#xff0c;那么我保证您会喜欢使用此工具的&#xff0c;为什么&#xff1f;我将在本文中讨论原因&#xff0c;请注意&#xff…

音视频开发9 FFmpeg 解复用框架说明,重要API说明

一&#xff0c;播放器框架 二 常用音视频术语 容器&#xff0f;文件&#xff08;Conainer/File&#xff09;&#xff1a; 即特定格式的多媒体文件&#xff0c; 比如mp4、flv、mkv等。 媒体流&#xff08;Stream&#xff09;&#xff1a; 表示时间轴上的一段连续数据&#xff0…

数据整理的Compact流程 (二)|OceanBase数据转储合并技术解读(二)

上篇文章《数据整理的Compact流程 &#xff08;一&#xff09;&#xff5c;OceanBase数据转储合并技术解读&#xff08;二&#xff09;》中&#xff0c;有讲解到&#xff0c;在OceanBase数据库中&#xff0c;当MemTable写满时&#xff0c;将其下刷到Mini SSTable的过程包含两个…

「小明赠书活动」第四期《Java开发坑点解析:从根因分析到最佳实践》

目录 ⭐️ 赠书 - 《Java开发坑点解析&#xff1a;从根因分析到最佳实践》 参 加 活 动 方 式 见 文 末 ⭐️内容简介 -《Java开发坑点解析&#xff1a;从根因分析到最佳实践》 ⭐️阅读建议 -《Java开发坑点解析&#xff1a;从根因分析到最佳实践》 ⭐️《Java开发坑…

CSS 介绍及用法,常用属性

一、CSS介绍 A. 简介 CSS全称&#xff1a;全称为层叠样式表&#xff08;Cascading Style Sheets&#xff09;&#xff0c;是一种用于描述网页外观和格式的计算机语言。CSS可以使网页的布局更加丰富和多样化&#xff0c;并且可以将样式信息与网页内容分离&#xff0c;使得网…

C语言——基于stm32G030的温湿度传感器项目实验

一、功能要求&#xff1a; 设备自检功能&#xff1a; 设备上电自检&#xff08;检查传感器采集是否正常&#xff0c; DHT11有存在响应&#xff0c; 可以自检使用&#xff0c; &#xff09;自检通过后&#xff0c;由串口打印设备状态信息。 自动控制功能&#xff1a; 进入自动控…

python连接FTP服务器:[WinError 10054] 远程主机强迫关闭了一个现有连接

一、原始报错信息 pythonProcess finished with exit code -1073740791 (0xC0000409) 这个报错信息&#xff0c;太过于笼统&#xff0c;是分析不出代码出了什么问题的。 二、打印详细报错信息 在服务器相关可能报错的地方&#xff0c;进行报错信息追踪&#xff1a; import …

如何在OrangePi AIpro智能小车上实现安全强化学习算法

随着人工智能和智能移动机器人的广泛应用&#xff0c;智能机器人的安全性和高效性问题受到了广泛关注。在实际应用中&#xff0c;智能小车需要在复杂的环境中自主导航和决策&#xff0c;这对算法的安全性和可靠性提出了很高的要求。传统的强化学习算法在处理安全约束时存在一定…

SpringBoot搭建OAuth2

背景 前几天自己从零开始的搭建了CAS 服务器&#xff0c;结果差强人意&#xff08;反正是成功了&#xff09;。这几天&#xff0c;我躁动的心又开始压抑不住了&#xff0c;没错&#xff0c;我盯上OAuth2了&#xff0c;大佬们都说OAuth2比CAS牛批&#xff0c;我就想知道它有多牛…

Elasticsearch不删原有jdk8导致的系列安装和启动问题

以前在空机器直接装elasticsearch&#xff0c;没有遇到什么问题。今天在现有JDK上安装&#xff0c;遇到的问题记录一下&#xff1a; 1. JDK的环境变量配置与我原有的不一致报如下错误&#xff1a; [estestZK-DES-I root]$ /usr/elasticsearch/bin/elasticsearch could not fi…

SSL函数01-数组函数Array Functions

一、数组的初始化 SSL中&#xff0c;数组下标从1开始&#xff01; 1-1、不知道数组的长度 :DECLARE a6; a6 : {}; Aadd(a6,a); Aadd(a6,b); Aadd(a6,c); 当用a : {}创建一个数组的时候&#xff0c;不可以用a[1] 值&#xff0c;来赋值&#xff01; 1-2、知道数组的长度 方式一…

【录用案例】2天录用!提交可录,沾边即可!

本周投稿推荐 SSCI • 2区社科类&#xff0c;3.0-4.0&#xff08;录用友好&#xff09; EI • 计算机工程生物医学等&#xff08;2天录用&#xff09; CNKI • 3天内初审录用&#xff0c;随即出版&#xff08;急录友好&#xff09; SCI&EI • 4区生物医学类&#x…

数据链路层 + NAT技术

数据链路层&#xff1a;负责设备之间的数据帧的传送和识别。 一、以太网 以太网的帧格式 如何分离报头和有效数据&#xff1f; 报头是固定长度的 如何将数据交给上层协议&#xff1f; 通过类型&#xff0c;如果是0800&#xff0c;则交给IP协议&#xff0c;如果是0806&#xf…

JavaScript正则表达式

一、介绍 正则表达式是用于匹配字符串中字符组合的模式。在javascript中&#xff0c;正则表达式也是对象。通常用来查找、替换那些符合正则表达式的文本&#xff0c;许多语言都支持正则表达式。 正则表达式的作用&#xff1a; 表单验证&#xff08;匹配&#xff09;、过滤敏感…