网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数: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
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示