首页 / 程序员圈 / 正文
C++|类的分类:类指针、类函数的类及是否包含指针成员的类
bxhadbfx6 发表于:2020-4-24 04:01:48 复制链接 看图 发表新帖
阅读数:24907

下载APP可以快速和圈友联系

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
C++的类是笼统数据范例(Abstract Data Type,ADT)的最好理论,实现了数据和操纵数据的函数的封装,接口实现和利用的分手。类的分类可以让我们对C++的类有一个更深入的熟悉。
1 Object Based (基于工具) 与Object Oriented (面向工具)


Object Based : 面临的是单一class 的设想。

Object Oriented : 面临的是多重classes 的设想,classes 和classes 之间的关系,如工具的继续、组合等。
2 Class without pointer member(s) 与Class with pointer member(s)


在C和C++中,对于数据的初始化和堆内存的开释对于法式的平安性来说相当重要,在C++的类中,经过机关函数和析构函数可以自动化完成这一进程。基于析构函数能否需要开释堆内存,类可以分为包括指针成员的类和不含指针成员的类,对于包括指针成员的类,凡是会有堆内存的分派,由这个指针成员指向一块堆内存,所以在析构函数中对其开释就显得很重要,如string类。固然,不是说没有指针成员或不需要开释堆内存就不需要析构函数了,在特定场所,如一个类的工具计数,当析构时,也可以对一个计数的数据停止“--”操纵。

即使法式员没有忘记开释堆内存,但由于潜伏的一些异常会能够会改变法式既定的流程,从而能够使free()或delete语句没有机遇履行。

2.1 Class without pointer member(s):complex类

C++|类的分类:类指针、类函数的类及能否包括指针成员的类-1.jpg

上述complex类的数据成员并没有指针成员,所以也没有堆内存申请的行动,由此,假如其析构函数~complex()并不做特此外操纵,利用其默许的析构函数即可。

2.2 Class with pointer member(s):string类

C++|类的分类:类指针、类函数的类及能否包括指针成员的类-2.jpg

上述string类,其数据成员只要一根指针,用于指向申请的堆内存,堆内存利用完后需要析构,所以其析构函数就显得很重要了,需要重新界说:

C++|类的分类:类指针、类函数的类及能否包括指针成员的类-3.jpg

同时,为避免浅拷贝而引发的潜伏题目,拷贝机关与拷贝赋值操纵符都需要重新界说:

C++|类的分类:类指针、类函数的类及能否包括指针成员的类-4.jpg

C++|类的分类:类指针、类函数的类及能否包括指针成员的类-5.jpg

3 pointer-like classes:智能指针


C++不像Java,没有内存接管机制,堆内存需要手动开释始终不是一个最好的挑选。操纵类的析构函数自动挪用这一特征,似乎可以做一些工作。对,就是封装一个需要指向堆内存的指针,由析构函数来自动完成内存开释这一行动。智能指针的初衷即来自于此,固然,智能指针还可以界说一些更智能化的操纵,如share_ptr的工具计数、unique_ptr的一切权转移。

下面这张图很好地说了然智能指针的内部结构和利用方式:

C++|类的分类:类指针、类函数的类及能否包括指针成员的类-6.jpg

智能指针在语法上有三个很关键的地方,第一个是保存的内部指针,对应于上图的T* px,这个指针将取代传入指针停止相关传入指针的操纵;第二个是重载“*”运算符,解援用,返回一个指针所指向的工具;第三个是重载“->”运算符,返回一个指针,对应于上图就是px。
4 pointer-like classes:迭代器


在C++中,泛型编程的最好理论就是STL库了。C++的类实现了数据结构和操纵数据结构的函数的封装,相对于数据与操纵的分手,这是一进步,但当两者的连系度不是很高时,大概想让作为算法的函数可以自力于特定的数据结构而有更高的通用性时,这就是泛型编程的思惟。STL用类模板封装数据结构为容器,用函数模板封装算法库,经过封装容器类工具的指针的迭代器来联络算法库与容器类,实现算法对容器一定的自力性,从而实现其通用性。

迭代器也是一种智能指针,这里也存在上面提到的智能指针的三个要素,别离对应于下图的红色字体和黄色标注部分:

C++|类的分类:类指针、类函数的类及能否包括指针成员的类-7.jpg

下图是迭代重视载的“*”和“->”重载符:

C++|类的分类:类指针、类函数的类及能否包括指针成员的类-8.jpg

建立一个list迭代器工具,list::iterator ite; iterator是一个内部类,是list的内部类,这里的list用于保存Foo工具,也就是list模板界说里的class T,operator*()返回的是一个(*node).data工具,node是__link_type范例,但是__link_type又是__list_node*范例,这里的T是Foo,所以node是__list_node*范例,所以(*node).data获得的是Foo范例的一个工具,而&(operator*())终极获得的是该Foo工具的一个地址,即返回Foo* 范例的一个指针。
5 function-like classes:functor 仿函数


我们排序时,升序还是降序排列,设想的升序或降序排序算法只要一行代码的分歧,假如写成的一个函数既可以做升序也可以做降序排序呢?用一个函数指针做参数即可。

函数的运算符是“()”,而类对"()"的重载即可以模仿函数的行为,称为仿函数或函数工具。仿函数是对函数指针的一种增强,仿函数相对于函数指针,既可以操纵工具状态,还可以由编译器做一个内联挪用,从而具有更佳的性能。

C++|类的分类:类指针、类函数的类及能否包括指针成员的类-9.jpg

重上图可以看到,每个仿函数都是某个类重载“()”运算符,然后酿成了“仿函数”,本色还是一个类的函数,但看起来具有函数的属性。每个仿函数实在在背后都集成了一个希奇的类,以下图所示,这个类不用法式员手动显式声明。

C++|类的分类:类指针、类函数的类及能否包括指针成员的类-10.jpg

标准库中的仿函数也一样继续了一个希奇的类:

C++|类的分类:类指针、类函数的类及能否包括指针成员的类-11.jpg

这个类的内容以下图所示,只是声了然一些工具,里面没有现实的变量大概函数。

C++|类的分类:类指针、类函数的类及能否包括指针成员的类-12.jpg

ref

C++面临工具高级编程[侯捷]

https://www.bilibili.com/video/BV1S7411p7g2

-End-


上一篇:linux常用号令详解-开关机
下一篇:Python都学什么,失业偏向有哪些?
温馨提示:
下载好向圈客户端可以随时随地交流学习经验,也可以和圈友发起聊天成为好友
好向圈www.kuaixunai.com是一个专业经验分享交流平台,请提供优质的经验内容分享,拒绝任何广告内容出现,低质量广告内容硬广包含手机号码,微信,QQ或者二维码,网址等形式存在可能会审核不通过甚至封号 圈友联系仅限于好向圈APP进行及时沟通咨询 要想被各大搜索引擎尽快收录请做好内容原创工作,才会有更好的推广效果。
返回列表
使用道具 举报
#指针, #一个, #数据, #堆内存, #内存
条评论
您需要登录后才可以回帖 登录 | 立即注册
小穆2017 发表于 2020-4-24 04:08:39 | 阅读全部
使用道具 举报
回复
沙锅盖聘 发表于 2020-4-24 04:14:36 | 阅读全部
转发了
使用道具 举报
回复
    侵权投诉可通过好向圈APP举报投诉----社区技术支持:泰帮动力 江苏好向圈信息科技有限公司 网站地图1 网站地图2