前言
提示:本篇将为大家讲解一个全新的知识点—类和对象。
类和对象是我们学习C++路上的一个非常重要的知识点,只有我们把这部分的内容学好,学扎实,才能应对往后更加困难的挑战,虽说这部分也已经很难了。
一、类的定义
在我看来,类就是一个变量的整合形式,其功能与我们在学习C时的struct关键字非常相似,但也有一些细微的差别。
1.类定义格式
我们所说的类类型,其关键字名为class,假如我们想定义一个名为Stack的类对象,那么如下面代码所示:
class Stack
{
//类中的内容
};//分号不能省略
与struct结构体变量相似,class类变量也有一些成员的整合。但我们把这些成员分为两个部分,一部分称为成员函数,另一部分就是成员变量。示例如下:
class Date
{
public:
void Init(int year,int month,int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
}
如上代码,Init函数为成员函数,int类型的三个变量我们称为成员变量。
2.访问限定符
访问限定符,顾名思义就是程序员在访问类里面的内容时,有些东西无法直接访问,被限定了,用来限制这些成员被访问的权限的符号我们就称为访问限定符。
一共有三种:
1.public:中文释义为“公众的”,即包装在public中的成员,可直接访问。
2.private/protected:中文释义为”私有的,受保护的“,即包装在private/protected中的成员,无法直接访问。
我们来看看它们是如何使用的:
class Date
{
public://这个就是访问限定符
void Init()
{
....
}
private:
int _year;
int _month;
int _day;
};
Tip:访问限定符的范围:出现一个访问限定符直到遇到另一个访问限定符中的部分。
如上面代码所示,public的范围就是public下面private上面的这块部分。
二、类的实例化
1.实例化是什么
实例化是在物理内存中创建对象的过程,称为类实例化出对象。
一个类可以实例化出多个对象,实例化出的对象,占用实际的物理空间,存储类成员变量。打个比方:

类就像我们房子的设计图,但是真真实实的房子还没建造出来,就像实例化一样,房子的实例化就相当于利用图纸把房子设计、建造出来一样。类也是一样的,类只是一个模型,需要分配空间才能存储数值。
2.代码演示
#inlcude<iostream>
using namespace std;
class Date
{
public:
void Init(int year,int month,int day)
{
_year = year;
_month = month;
_day = day;
}
private://这里只是声明,不是定义,区分声音和定义就是看有没有开空间,很显然,我并没有定义一个Date类类型的变量
int _year;
int _month;
int _day;
};
////
int main()
{
Date d1;//这就相当于实例化
d1.Init(2025,7,22);//这就为Date类型的d1的成员变量存储了相应的值。
return 0;
}
上述代码所示,语句Date d1就相当于对类进行实例化,相当于从一个空壳变成了一个实体。
3.对象大小
我们在C语言的学习就知道了,一个函数,它的名字,本身也是此函数的地址。那么在一个类的定义过程中,又分为了成员函数和成员变量,两个类类型变量的不同,只是成员变量的不同(准确来说就是成员变量存储的值不同),而这个类中的成员函数都是一样的,那么一个类变量有没有必要在已经存储成员变量的空间下,再延申一部分空间去存储大家都一样的成员函数,显然是没必要的。那么是为什么呢?

显然我们刚才在讨论存储方式1与2,类成员变量的不同通常只是其中成员变量的差异而形成的不同(例如一个存储2025 1 1,另一个存储2025 7 22),而每个类成员变量中的成员函数名都是相同的(因为要调用函数就得call这个函数的地址),所以在分配内存给类成员变量时,往往都是开辟空间存储其成员变量。
还有一种特殊情况就是,一个类中没有成员变量只有成员函数,那么编译器会开辟一个字节的空间用来表示这个成员函数。
3.this指针
在讲解this指针之前,我们先来一段代码引入this指针的用途:
#inlcude<iostream>
using namespace std;
class Date
{
public:
void Init(int year,int month,int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << "/" << _month << "/" << _day <<endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1;
Date d2;
//创建两个类类型的变量
d1.Init(2025,1,1);
d1.Print();
d2.Init(2025,7,22);
d2.Print();
return 0;
}
大家看main函数中的代码,d1.Init和d2.Init都调用了Init函数用于自己的类成员变量的初始化,但我们前面说过,不同的类成员变量中的成员函数都是相同的,那么d1和d2变量为什么会被初始化成为不同的值呢?(括号中的数字不同还不是重点)
原因就在于:
在调用d1与d2的Init,会分别把d1和d2的地址分别传过去,然后Init函数就会用this指针接受d1和d2的地址,所以我们可以用画图的方法表明整个过程。
所以,用一句话总结就是:不同的类成员变量在调用相同的函数时,通过传递本身的地址,从而来修改自己本身成员变量的值。
总结
类就是一个物体的外壳,对象就是类的实例化对象,一个实体。
本章节是类和对象的开篇,相对来说比较容易,大家需要多打代码才能领悟本质。

1万+

被折叠的 条评论
为什么被折叠?



