C++入门基础二(类和对象)

目录

写在前面的话 

一,初识面向对象

二,C/C++中的结构体

三,初识类

3.1初识类

3.2类的成员及访问限定

3.3面向对象之“封装”

3.4类的作用域及实例化

3.5类对象的大小

3.6this指针

3.6.1this 指针的引出

3.6.2 this指针的特性


写在前面的话 

小伙伴们大家好啊!这里是小菜鸡库森,今天依旧为大家带来有关C++的基础内容。

那么我们废话不多说,进入今天的主题 -- 类和对象。

                                   

一,初识面向对象

我们知道,C语言是一种面向过程的语言,主要是分解出解决问题的步骤,通过各个函数去逐步解决问题。

 

但是这样的语言其实是有一定的局限性的,因为如果我们需要解决一个比较复杂的问题,那么可能我们需要用到很多函数,如果我们将每一个函数去实现,最后可能解决这个问题也就是几行代码。但是不可缺少的是,我们一定需要用到那些占了大篇幅的函数。

所以,前辈们提出了面向对象的编程语言C++,它将一件事分为几个对象,然后依赖这些对象之间的交互完成整个函数的实现。

那么对于上面的问题,它会将所有这些我们需要用到的函数几乎全部封装起来,然后我们需要用到的时候只需要调用接口即可。

而这仅仅只是一个面向对象语言其中一个特性,以后我们会继续了解到其他特性。

二,C/C++中的结构体

对于结构体来说,其实就是一句话:C++兼容C语言对结构体的用法,但是C++又提出了自己的想法:在结构体里面可以定义变量,也可以定义函数。

如下图所示:

那么在C++中我们通常将这种结构体称为类,并且将 struct 换为 class。

三,初识类

3.1初识类

如上结构体所示,我们知道类表示的也是类似于结构体一样的内容。但是又有一些不同。

类的类型可以是 class 或者 struct,但是一般我们会使用 class ,然后后面接着是类名,一对 { },花括号里面是类的实现,最后再花括号后面是一个分号,作为类的结尾。如下图所示:

3.2类的成员及访问限定

那么对于括号中的类的成员,C++通过封装的方式,用类将对象的属性和方法,通过访问限定将其接口选择性提供给外部的成员使用。

那么一定需要知道的是,C++是有三个访问限定符的,如下图所示:

那么我们通过这三个限定符可以将类的成员函数和成员变量封装起来,而对于访问限定符的具体使用细则如下:

1.只有 public 修饰的成员才可以在类外被访问。

2.访问权限默认是从当前限定符到下一个限定符之间。

3.class 定义的类默认访问权限为 private,而struct定义的类默认是 public,因为是struct 需要兼容C语言的用法。

对于类的成员,一般我们默认成员变量是私有的,而对于成员函数是公开的。

3.3面向对象之“封装”

那么其实上面我们提到了如何将类中的成员设置访问限定,只是提供一部分接口来在类外使用。

这里其实就是面向对象三大特性之一的 “ 封装 ”。那么对于封装这里我们做出一个定义:

封装就是将数据和操作数据的方法进行有机的结合,隐藏对象的属性和实现细节,仅仅是对外公开接口来和对象进行交互。

3.4类的作用域及实例化

因为对于类来说,它所有的成员都是在类内部定义的,所以在类外访问类的成员的时候,需要使用域作用限定符来访问类的成员。

同时我们知道,因为对于类来说,和结构体一样,如果不初始化,那么它依旧是一个模板,不是一个实体,所以我们需要通过类名实例化一个类,而对于类来说,类本身是不占用空间的,只有当它实例化了之后才会占用实际空间。

3.5类对象的大小

那么我们上面说了,类本身是不占用空间的,只有实例化对象之后,才会占用空间。

所以对象是占用空间的,类中既有成员函数,又有成员变量,那么对于类对象来说,它的大小是多少呢?

通过研究发现,其实类的对象只存放成员变量,而成员函数则存放在公共区。

那么如下图所示,每个类的对象的大小是多少呢?

因为对象中不存放成员函数,所以 A1 的大小为 4,A2 大小为 0,而对于 A3 类而言,因为它是一个空类,所以编译器给了一个字节的空间来标识这个空类。

当然,如果类中的成员变量很多的话,它们一定也遵守结构体内存对齐的规则。

3.6this指针

3.6.1this 指针的引出

那么当我们有了对象之后,一般我们会首先将该对象初始化。如果此时我们有多个对象需要初始化,但是在初始化函数中,并没有参数来表示当前函数初始化的是哪个对象。

如下图所示:

两个对象都需要初始化,那 Init 函数需要初始化哪个函数呢?

其实,这里在对象调用该函数时,是传递了对象的地址的,同时在初始化函数中是有一个参数this 来表示当前对象,所以每个对象在调用时,才不会发生错误!

如下图所示:

但是实际上我们不会这么写,因为this指针叫做隐含指针,所以我们一般不会显示的写出来,但是实际上是存在的,这样才不会导致对象调用的时候不出错。

3.6.2 this指针的特性

那么首先,如上图所示,this指针是隐含指针,不会显示的写出来。

所以在C++中,编译器给每个非静态成员函数增加了一个隐含的this指针,使得该指针指向当前对象,所以函数中所有变量的操作都是通过该指针实现的。但是因为这些操作都是编译器自己实现的,所以this指针一般不会显示的写出来。

那么对于this指针,我们做以下解释:

1.this 指针的类型是 类类型* const。因为对象在函数里面是不期望被改变的。

2.只能在成员函数内部使用。

3.this 指针存在栈中,不存在对象中,因为this指针终归还是一个形参。这其实也就验证了之前我们说过的对象中只存放成员变量的原因。

4.this 指针是第一个隐含的形参,一般情况下由编译器自动传递,所以不需要我们显示传递,在函数中同样也不需要我们主动实现。

好的,那么对于C++基础二,有关对象和类的有关内容就结束啦!如果觉得不错,up 主跪求支持鸭!

                                    

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值