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

 
 
 
日一二三四五六
       
       
       
       
       
       

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

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

本吧签到人数:0

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

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

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

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

  • 只看楼主
  • 收藏

  • 回复
  • 暗丶梦魇丶陨灭
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
有时候我们会看到有人发C语言和其他语言(比如某J语言)孰优孰劣的讨论,然后就常常看到有人回复:你说的这门语言可以用C语言写出来。遗憾的是,重来没有人给我说该怎么写。不过要是问你C语言和其他高级语言最大的区别,你可能会毫不犹豫地回答:C语言是面向过程的语言,不支持面向对象。那么,我们反过来想一下,如果用C语言实现了面向对象,那是不是就拉近了C语言与其他语言的距离呢?这并不是不现实的,因为面向对象本来就是一种思想,而不是一种语法。想到就做,于是无聊的我踏上了这样一段然而并没有什么那啥用的征程。


  • 破晓的孤狼
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
C可以基于对象编程


2025-07-21 20:53:47
广告
不感兴趣
开通SVIP免广告
  • 次奥哒
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
楼主继续


  • 暗丶梦魇丶陨灭
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
说到面向对象编程(OOP),就会说到类和对象,说到面向对象的三大特性。简而言之,只要我们创建出了类和对象,实现了面向对象的三大特性,那基本上也就实现了面向对象。至于其他的细节,其实并不重要。因为真要用C语言去做面向对象的开发还是听蛋疼的,之所以要用C来实现面向对象,目的只是为了探究面向对象编程的底层实现(毕竟要知其然并知其所以然嘛)。如果真要去做面向对象,选择一门面向对象的语言开发效率要高得多。


  • 暗丶梦魇丶陨灭
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
面向对象三大特性:封装、继承和多态。其中,封装是最好理解的,因为即使是c程序员,也经常会用到类似的方法。听名字你就会有点感觉,封装嘛,有点把一堆东西打包的感觉。我们实际写代码的时候,即使不使用面向对象,也会把一系列的函数放到一个文件里。你不会把scanf函数放到stdlib.h里声明,因为它们逻辑不相关。所以,封装的本质就是将一系列的有逻辑关联的数据和函数放在一起管理。大部分语言会使用一个名为class的关键字完成封装,而C语言是没有这个关键字的。但是没关系,我们只看本质,没有就没有呗,大不了我将相关代码放到同一个文件不就好了。当然,你可以使用struct来模拟封装,但我并不认为这就是个最好的办法,后面会详细说明。


  • 暗丶梦魇丶陨灭
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
一般来说,很多语言会使用class定义一个类,然后用这个类创建一个实例。那么,什么是类,什么又是实例呢?有一个最经典的比喻,类就是生产实例的工厂。这样说还是挺抽象的,我们可以举个例子,int a; 其中int 就好像是类,a就是一个实例。虽然这个例子并不太精准,但是大概意思是这样的。类封装了很多数据和函数,这些数据和函数都不是莫名其妙存在的,而是有一定的意义,简单来说,就是针对着一个对象。举个简单例子,你桌面上打开个窗口,这个窗口是一个对象,你可以用鼠标拖动窗口,因为这个对象有对应拖动的函数来实现;你可以最小化窗口,因为这个对象有实现最小化的函数,你的窗口有个高度和宽度吧,这些就记录在这个对象的高度和宽度属性里面的。这样,一系列针对同一个对象的函数(我们称之为方法)和数据(一般被称为属性,有时候方法也是作为属性看待)被封装在一起,形成一个类。类是用来定义实例的,你可以打开一个窗口,也可以打开很多个窗口,这些窗口就是一个个实例,虽然有很多个窗口,但是它们都是基于同一个模板生成的,模板就是类。了解类和实例是有意义的,区分其不同之处也是有意义的,这毕竟是实现面向对象的基础。


  • 心眼观物
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


  • ly19770103132
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
楼主继续!
----From iTieba for Windows Phone


2025-07-21 20:47:47
广告
不感兴趣
开通SVIP免广告
  • 暗丶梦魇丶陨灭
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
虽然C语言没有class关键字,但是我们姑且假定它有这么一个定义类的关键字,那么要定义类应该是类似如下的代码:


  • xvde110
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
没有private public


  • 暗丶梦魇丶陨灭
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
在上述代码中,data1,data2,str都是类ClassName的属性,而函数Init和Fun则是这个类的方法。从中基本上可以看出来类是将数据和函数打包在一起,所以类本身没有什么神秘的。假如我们创建了上面的类,那就应该继续用上面的类来产生一个实例,如下表示:


  • a327380135
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
嗯,快去翻看早期C艹实现,然后一步步往后看,然后再自己坑一个现代C++编译器的C实现,我看好你哦


  • 霶霈的霡霂
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
楼主继续


  • 暗丶梦魇丶陨灭
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
当然,上面的Instance需要声明(比如用new关键字),不过这不是重点,重点是我们通过类创建了实例。拥有这个实例有什么作用呢?很简单,假如我需要调用属性data1,那我就会这样写:Instance.data1;假如我想调用方法Fun,那我就这样写Instance.Fun(Instance,100);(注意我第一个参数传回了Instance本身,很多语言里是不需要这个参数的,但实际上这个参数是存在的,只不过那些语言是通过编译器传递的,在语法里被隐藏了)。
现在你可以看到一点点引入类的好处了,我们可以创建许多实例,虽然它们名称不一样,但是只要它们是基于同一种类建立的,就可以调用相同的方法。


2025-07-21 20:41:47
广告
不感兴趣
开通SVIP免广告
  • silmerusse
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
其实大名顶顶的GObject系统,
也就是Linux主流桌面系统之一gnome的基石。
关于如何用C语言实现访问权限,可以参考 gobject的手册
私有成员是通过公开头文件中指向私有数据的指针,和把私有数据设置为static存储类型来实现的。


登录百度账号

扫二维码下载贴吧客户端

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