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

🎉🎉🎉欢迎莅临我的博客空间,我是池央,一个对C++和数据结构怀有无限热忱的探索者。🙌

🎈🎈🎈期待与你一同在编程的海洋中遨游,探索未知的技术奥秘💞

📝专栏指路:

📘【C++】专栏:深入解析C++的奥秘,分享编程技巧与实践。

📘【数据结构】专栏:探索数据结构的魅力,助你提升编程能力。

读者哥哥,姐姐是好人~

来和可莉一起学习吧~

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

1.1C语言是面向过程

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


1.2C++是基于面向对象

关注 的是 对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
在C++中洗衣服这件事是被这样看待的:
对象:人、衣服、洗衣粉、洗衣机
整个洗衣服的过程:人将衣服放进洗衣机、倒入洗衣粉,启动洗衣机,洗衣机就会完成洗衣过程并且甩干

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


2. 类的引入

在C语言中, struct 结构体类型中,只能 定义变量 ;C++兼容C中struct的用法,在此基础上C++在结构体内部还可以 定义函数 ,也可以 嵌套定义结构体 ,C++升级struct成了类,而在C++中类更喜欢用关键字 class

  • 类:在编程中,类是一个模板或蓝图,它描述了具有相同属性和方法的对象的集合。简单来说,类就是定义对象的模板。
  • 对象:对象是类的实例。当你使用类来创建一个新的实体时,你就创建了一个对象。这个对象具有类定义的属性和方法。

3. 类的定义

cpp 复制代码
class className
{
// 类体:由成员函数和成员变量组成
};  // 一定要注意后面的分号

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

2. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::
示例:


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

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

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. 类的作用域

类定义了一个新的作用域 ,类的所有成员都在类的作用域中 **。**在类体外定义成员时,需要使用 ::
作用域操作符指明成员属于哪个类域。
示例:

如图,我们定义了一个叫Person的类,void PrintPersonInfo();是类成员函数的声明,而此成员
函数的定义超出了类的作用域(也就是在类的外面),要让在类外面的函数属于类必须加上在函数
类型后面加上Person::(在类域外面不加Person::就好比小区里面的野狗没有主人;而加了Person::的是有主人的狗,受主人管控)


6. 类的实例化

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


7. 类成员函数的 this 指针

7.1this指针作用

非静态成员函数的隐藏指针参数, 该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有"成员变量"的操作都通过该指针访问。它能保证每个对象拥有自已的数据成员,但共享处理这些数据的代码。
注意:this指针并不需我们去定义,他是编译器自动生成的

7.2this指针特性

(1)类型: 类类型const*,成员函数中,不能给this指针赋值
(2)只能在"非静态成员函数"内部使用
(3)本质:非静态成员函数"的形参,当对象调用"成员函数"时将对象地址作实参传给形参this,所以对象中不存储this指针
(4)不需要用户传,一般存储在栈/寄存器ecx中

(5)this指针是否可以为空?
this指针可以为空,但是当它指向空之后,它就不能再访问成员变量
(6)this指针的应用
初步

进阶

cpp 复制代码
#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();
}

类与对象的旅程刚刚开始

接下来还有很多的冒险与挑战~

相关推荐
远望清一色10 分钟前
基于MATLAB的实现垃圾分类Matlab源码
开发语言·matlab
confiself19 分钟前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言
凌云行者29 分钟前
OpenGL入门005——使用Shader类管理着色器
c++·cmake·opengl
XiaoLeisj31 分钟前
【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期
java·开发语言·java-ee
凌云行者32 分钟前
OpenGL入门006——着色器在纹理混合中的应用
c++·cmake·opengl
杜杜的man34 分钟前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
幼儿园老大*35 分钟前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
半桶水专家36 分钟前
go语言中package详解
开发语言·golang·xcode
llllinuuu37 分钟前
Go语言结构体、方法与接口
开发语言·后端·golang
cookies_s_s37 分钟前
Golang--协程和管道
开发语言·后端·golang