九游体育app娱乐咱们齐知说念类的成员函数和类的成员变量是分开存储的-Ninegame-九游体育(中国大陆)官方网站|jiuyou.com
咱们齐知说念C言语是一门历程性言语,所谓历程性就是在搞定问题时,将问题按法子认识。
举例,作念菜的手艺,先燃烧,再倒油,接着下菜翻炒,终末加盐和酱油。但有手艺模仿面向对象的念念想来组织代码,逻辑头绪解愈加明晰。
C和C++的最大分辩就是,C++有类,C莫得类的认识。单单这一个类使得C缺失许多的东西。好在C有结构体,对付不错当0.1个类来使用。
无人不晓,类有三大特点:封装、领受、多态。咱们来望望C言语如何模仿类的三大特点来更好的组织代码。
1、领受
C言语莫得严格意旨上的领受,不错借助结构体嵌套已矣近似于领受的步地,但永久不尽东说念主意。
C++的类不错已矣成员的看望截止,举例将变量b声明成private,那么外部就无法看望。但C的结构体作念不到。
在C++里头,父亲的颠倒成员,女儿是无法看望的。结构体嵌套也作念不到。因为结构体压根就莫得看望截止的认识。
关于C++而言,看望截止实质上是在编译层作念的,咱们仍旧不错通过指针来迤逦看望。
举例:
尽管b被声明成颠倒,但咱们仍旧有目的看望它(借助指针绕过语法查验):
2、封装
封装就是把数据和方法打包到一个类里面。C++的已矣节略如下:
这样作念的公正是无庸赘述的。
一个类已矣了一个小模块,使得代码结构比拟明晰。对外接口和数据界说成public,允许调用者获胜看望。
里面接口和数据界说成private,外部不可见。
在 QT 中,为了更好的覆盖一个类的具体已矣,一般是一个公开始文献、一个颠倒头文献,颠倒头文献中界说已矣的里面细节,公开始文献中界说绽放给客户挨次员的接口和大流派据。望望QObject (qobject.h),对应有一QObjectPrivate(qobject_p.h ) ,其他的也近似。
咱们不错借助C言语的指针和结构体来已矣方法和数据的封装。基本框架如下:
在结构体里界说成员变量很容易,获胜int a;
在结构体里界说成员函数要使用函数指针,比如:
是以,咱们把上头的框架具体化就是:
本质上,C++的成员函数亦然通过函数指针的步地来已矣,骨子上是一致的。
咱们齐知说念类的成员函数和类的成员变量是分开存储的,归拢个类的统统对象,成员函数只需要占据一份地址空间。
在界说结构体之后,函数指针并莫得赋值,一般咱们会界说一个结构体驱动化函数来驱动化结构体成员,这有点近似于类的构造函数,但类的构造函数在创建对象时自动调用,而咱们这个结构体驱动化函数只可我方手动调用了。
一样的,对标C++的析构函数,咱们在C言语里头有一个去驱动化的函数来完成模块的去驱动化,这种念念想不就是一样的吗?
伪构造函数
瞩目,咱们把两个operation函数界说成了static,这样式文献以外的函数就不可调用它,只可通过manager结构体来调用。是不是嗅觉有点封装的意味。
去驱动化函数我就不写了。
为了达到上头的方针,纯粹修改下,咱们把函数operation2界说成一种类型,
结构体界说稍作修改:
结构体驱动化函数也要作念相应的修改,增多了一个函数指针形参:
通过上头的操作,咱们用结构体和函数指针完成了模块化封装。
我看了网上的博客,有些东说念主为了有利效法类,还用以下方式已矣了近似于类的构造函数:
以及近似于类的析构函数:
使用示例:
个东说念主不是很可爱这种作念法,万一健忘调用manager_delete还有内存露馅的风险。
结构体九九归原依然结构体,不可已矣成员对外不可见。而C++中将成员声明成private之后,外部就无法看望了。
C言语里想这样作念,只可将该成员移出结构体,界说为static步地。因为C不维持在结构体里面界说static变量(不信,你不错我方去试下)。
为何不可在结构体内界说static变量,想想就知说念了,static变量的地址在编译邻接之后是独一且笃定的,而结构体只好在实例化时才气笃定其地址,况兼每个结构体实例齐有我方的地址空间。
3、多态
多态在上头的例子也有体现。C言语已矣的多态并非是严格意旨上的多态,然则这种念念想的欺诈很无为,咱们姑且叫它多态吧。你不明C++的多态也不遑急,涓滴不影响你荟萃下文。
linux的VFS便模仿了这种念念想。VFS(Virtual File System)是内核提供的文献系统概述层,其提供了文献系统的操作接口,不错覆盖底层不同文献系统的已矣。
一个文献系统无非就是已矣对文献、目次的治理。针对文献VFS界说了长入的结构体:
strcut file代表一个文献,每种文献系统(比如ext3,vfat)已矣读写等操作的方式齐不一样,是以将这些方法封装成函数指针,长入界说在结构体struct file_operations内。
每个文献系统各自完成我方的已矣。
再写一个本质的例子。
界说一个东说念主的挨次接口和数据如下:
中国东说念主碰头时,说你好:
英国东说念主碰头时,说hello:
咫尺来驱动化它们各自的致意方式:
英国东说念主和中国东说念主对外呈现齐是struct man,其碰头致意的接口齐是man.say_hello,但其底层已矣却不错不一样。
况兼咱们不错在挨次运行时,减轻的改革中国东说念主的致意方式。比如婴儿时代,只会“哇哇”叫,长大了才会说“你好”,咱们不错改形成员say_hello的值,让其在不同期期指向不同的函数,从而达到运行时多态的方针。
其实呢,C++的多态,亦然通过函数指针来已矣的,学习过C++的同学就会知说念,含有虚函数的类,会爱护一个虚函数表,里面存放了虚函数的地址。
是以说啊,C言语是C++的母语,万变不离指针九游体育app娱乐,指针是C言语的一大法宝。