网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月25日漏签0天
c语言吧 关注:798,851贴子:4,357,542
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 首页 上一页 1 2 3 4 下一页 尾页
  • 57回复贴,共4页
  • ,跳到 页  
<<返回c语言吧
>0< 加载中...

回复:听说C语言也可以面向对象,就让我们一起愉快地实现它吧

  • 只看楼主
  • 收藏

  • 回复
  • 暗丶梦魇丶陨灭
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
前面我基本上讲解了封装的简单做法,当然实际上封装还可以设置属性的权限,不过我认为这不重要,但如果你真的认为很重要也没关系,实现权限管理并不困难,你可以强制要求所以属性只能通过特定函数获取,然后在函数里实现权限管理。而且C语言还提供了static和const关键字,所以只要你愿意你可以去完善。但我要再次申明一次我的观点,这不重要,这并不是oop的核心,记住,oop的特性是封装、继承和多态,而不是权限。封装有一点权限管理的味道,但当初提出封装的理念绝不是为了管理权限。
现在我们继续考虑,我之前假定了一个伪造的关键字class,并简单介绍了实例如何调用属性和方法。不知道你发现没有,这里的伪关键字class是不是很像C语言本来就有的一个关键字struct?没错,太像了。事实上,在c++里面struct已经具有了面向对象的特征。那么我们是不是可以考虑利用struct来实现封装呢?


  • 暗丶梦魇丶陨灭
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼



2025-07-25 11:42:46
广告
不感兴趣
开通SVIP免广告
  • 暗丶梦魇丶陨灭
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这样也实现了对属性的封装,通过结构体调用属性简单又方便。至于封装,就像前面说的,把所有方法属性都集中在一个文件里,也可以算是完成了封装,你甚至还可以调用static对某些属性私有化。
遗憾的是,现实没有这么丰满。因为oop可不止封装这一个特性,甚至可以说封装根本不是面向对象最重要的特性。之所以需要封装,一方面是为了方便管理,符合人的逻辑,另一方面则是为了给面向对象另外两个特性提供支持。可以说,另外两个特性才是oop的精髓所在。这涉及到面向对象的一个非常重要的目的:实现代码的可重复利用。接下来我们将会逐渐深入oop本质,从根本上体会面向对象的实现过程。


  • 暗丶梦魇丶陨灭
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
前面说了那么多,其实都只是铺垫,下面将进入关键剧情:oop究竟是什么?
现在我们先看下假如我已经有了几个类该怎么使用,同样用虚拟代码表示:



  • 暗丶梦魇丶陨灭
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
上面1-14行我创建了五个类,16-28行利用这些类创建实例并调用属性。你会发现很有趣的现象,例如第16行,用C创建X,X可以调用C的属性c是理所当然的,同时它也能调用A的属性a,下面也有类似的情况。如果你仔细观察的话,就会发现,C后面的括号里写了A,于是X就可以调用a了。这种现象叫做继承。其中,A是C的父类(超类),C是A的子类(衍生类)。利用子类生成的实例可以调用父类的属性,从而实现代码的重用,这是非常有意义的。当然,这里我们看到的只是现象,光是知道现象是不可能用C语言实现的,但是如果知道了现象,我们再去讨论本质会跟深刻一点,所以下面我会先把多态的现象描述一遍。


  • 351317878
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
继续
   -- 我要给你生猴子


  • 暗丶梦魇丶陨灭
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

这里X由C类创建,Y由A类创建,A是B的父类,B是C的父类,这里X.a和Y.a的值是多少呢?即使你之前没有接触过oop,相信你也想到了,X.a=3,Y.a=1,这种现象叫做多态,简单来说,子类可以对属性和方法重写。这也是实现代码可重用的重要手段,因为如果代码不可重用,那么不同的子类在同一个属性上如果有差异,这代码就没法用了,继承的作用也就很小了。正是因为有了多态,才使得代码能够尽可能实现重用。当然,这里没有考虑类属性和实例属性的区别,不过暂时可以不管这些,在后面会自然而然将其区分开来。


  • 魏晋秋
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
厉害啊
   --如果可以,我想创造一个世界


2025-07-25 11:36:46
广告
不感兴趣
开通SVIP免广告
  • TLast_Ghost
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
面向对象只是一种思想,本来就是C代码中产生的。。。你看一下较为有体系的C框架,本质就是面向对象方法。。。
比如linux中有个叫做设备device的结构体,他下面还有块设备,平台设备,字符设备的抽象结构体,还有驱动的结构体叫Driver等。。 都是没有实现实际功能的,相当于抽象类,每个结构体中有大量被linux定义好的函数指针(相当于抽象方法,在函数初始化时,由初始化函数为其虚函数指针赋值,相当于类构造)。。。。这些结构体可以被绑定到驱动和设备目录中(设备管理的基础方法已经被linux实现,你只要按要求注册设备号,设备名等信息即可,这相当于device结构体的通用静态方法),方便设备和驱动管理。。。驱动实现者只要按照结构体要求实现方法,在设备驱动被使用并初始化时赋值给抽象函数指针即可。。。。比如所有的Char设备都有,read write方法,是一个函数指针,其实功能对应C++中的虚函数。。 还有必须实现的驱动启动化方法,驱动卸载方法都属于基类结构体定义的抽象方法,类似构造函数和析构函数。。。使用者只要按常规打开文件的方式打开驱动文件,就会自动调用驱动初始化,并可以通过文件操作规定的通用API去操作驱动。。
当然这种面向对象方法调用必须带结构体指针,相当于this指针,C++的成员函数其实也有this指针参数传递,只是他隐藏了,C语言必须显示传递。。


  • 暗丶梦魇丶陨灭
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
现在我们可以考虑下oop的本质了。请注意这里是重点,即使你不懂oop,即使你前面没看懂,即使你后面的代码没搞懂,这里懂了,那你就明白oop的本质了。
******************************************************************************************************
*******************************************************************************************************
假如我定义了类A->B->C,又用C创建了一个实例K,然后我调用K.a,会发生什么呢?很简单,编译器首先在实例K的作用空间里寻找属性a(因为K一般本身也会有一些属性,这些属性构成了K的作用空间),如果没有找到a,编译器就会去定义K的类C中寻找,如果C中没有找到,就去C的父类B中寻找,同理,B中没找到就去B的父类A中寻找,这个过程中找到了,就立即停止寻找,并返回a,这就是为什么我在K中可以调用A的属性的原因,也是为什么在C里面可以重写A中的属性的原因。这就是继承和多态的本质,也是oop的本质!
*********************************************************************************************************
********************************************************************************************************


  • 暗丶梦魇丶陨灭
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这里顺便提一下多继承的问题,C(A,B)应该怎么找呢?当然不可能同时找,你可以先在A中查找,如果找不到再在B中查找,你也可以反过来。一般是推荐先在A中查找,因为人的逻辑顺序是从左往右的。当然,我需要再次强调,我是不推荐使用多继承的,因为很容易产生问题。
说到这里,如果我只是介绍下oop的原理的话,基本上就可以结束了。你应该发现了,oop本质上是很简单的,并没有那么神秘和复杂,只是很多编程语言加入了很多特性和语法,使其变得高大上,让人望而生畏,甚至很多人虽然会用各种面向对象的语法却不懂其本质。
但是,我要说一个但是,我在这里可不是只是简单介绍下oop是什么鬼,下面才是重点:用C语言实现面向对象。虽然我不会做得很完整,但是也会大致搭一个骨架出来。


  • 珊珊莫已然hf
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
然而并没有什么用


  • happy刘小凯
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
秋风缱婘,迫散流年,研墨执笔写下落叶偏偏,清风过处任细雨绵绵,寻声追去间,那抚琴少年,待寂寞入耳边,哪像我,转身落寞了流年。。。


青铜星玩家
百度移动游戏玩家均可认证(限百度账号),去领取
活动截止:2100-01-01
去徽章馆》
  • 葫小伟v
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
你嘴角三十度的微笑,百度搜索不到,所以我都用谷歌


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 首页 上一页 1 2 3 4 下一页 尾页
  • 57回复贴,共4页
  • ,跳到 页  
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示