类和对象(上)


前言

提示:本篇将为大家讲解一个全新的知识点—类和对象。

类和对象是我们学习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的地址,所以我们可以用画图的方法表明整个过程。
在这里插入图片描述

所以,用一句话总结就是:不同的类成员变量在调用相同的函数时,通过传递本身的地址,从而来修改自己本身成员变量的值。

总结

类就是一个物体的外壳,对象就是类的实例化对象,一个实体。
本章节是类和对象的开篇,相对来说比较容易,大家需要多打代码才能领悟本质。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值