C++的成员函数和普通函数

我看到公司以前同事写的代码中,有个类只有成员函数,没有数据成员,感觉不伦不类的。然后它的成员函数就是操作外边给过来的值,写到文件里的,或者把文件里的东西读出来的。但是仍然... 我看到公司以前同事写的代码中,有个类只有成员函数,没有数据成员,感觉不伦不类的。然后它的成员函数就是操作外边给过来的值,写到文件里的,或者把文件里的东西读出来的。但是仍然感觉奇奇怪怪的,就在想它这是不是为了对象化而对象化啊。这样的情况直接写一个普通的函数不就行了么?
有经验的能来说一下么?就是在以后的调用上,哪种更好?是这种没有数据成员的类好还是普通函数好呢?
展开
 我来答
davidaq
推荐于2017-09-13 · TA获得超过879个赞
知道小有建树答主
回答量:275
采纳率:0%
帮助的人:409万
展开全部

首先要知道类存在的理由,为何要面向对象。

C中的结构体就是定义一种数据格式,可以存储若干数据元素,并且它们的内存是连续的。

结构体的作用是封装一组有关联的属性,它们共同维护某种概念实体的状态。

在早期经典纯C工程当中,有经验的开发者早就开始利用结构体与函数指针实现简单的面向对象。

但是用结构体+函数指针使用不方便不灵活,所以C++最大的使命,面向对象就诞生了。

要注意的是C++与C的区别除了类之外,还有函数多态的特性、命名空间、STL等等特性。


类相比于结构体+函数指针最大的优势就是两个字:继承


撤了一大堆废话,针对LZ的问题可以归结为,在没有属性的时候,只有函数,使用类好不好,或者说何时可以如此使用。


如果LZ学习过设计模式,那么这个问题就颇为清晰,类的存在是为了更灵活地描述某种概念实体以及对它的操作。


一个只有函数而没有属性的类,其描述的实体可以认为是一种抽象的动作实体。


用通俗的话来讲,一个继承Animal的Cat类描述一个猫,猫有属性(形态,叫声,年龄等),也有动作(吃喝拉撒睡),这就是最经典LZ也熟知的一种类。


而抽象的动作类,就有比如一个继承File的DiskFile或者FtpFile等,它主要描述的是一组动作(读与写),它也许有状态(属性),也许没有。


这种抽象的动作类为何而存在?经典的策略设计模式就会大量地使用这种写法。


比如你要做视频处理软件,视频需要解码与加码如果只是用纯函数的化你的代码就会如下丑陋:

if(0 == strcmp(fileType, AVI)) {
    decode_AVI(file);
} else if(0 == strcmp(fileType, MP4)) {
    decode_MP4(file);
}
.....
if(0 == strcmp(fileType, AVI)) {
    encode_AVI(file);
} else if(0 == strcmp(fileType, MP4)) {
    encode_MP4(file);
}

但是如果你有一个类AVType,只有两个函数:encode、decode,然后有AVIType、MP4Type继承它,那么你的代码大致就是:

AVType* type = new AVIType(); // or MP4Type
type->decode(file);
....
type->encode(file);

当你的同类方法多起来(如rmvb、wmv、flv解码器等等),你就会发现后者有多优秀。


最后总结对LZ的问题的回答就是:

如果没有继承也不会存在潜在继承的可能,也就是说用不到C++的多态特新,那么没有属性的类就没有存在的必要。


今天闲的无聊,说了一堆废话,LZ跳着看就行了O(∩_∩)O~

追问
膜拜大神~~大神谦虚了,说的都很有用,受益啦!
另外想问下大神,大神贴的这个编码部分用的是什么编辑器,看的很舒服啊。
追答
百度知道自带的编辑器,好像只有回答问题时才看得到右上角有个“代码语言”
chouchouNUDT
2013-09-02 · TA获得超过1706个赞
知道小有建树答主
回答量:2954
采纳率:50%
帮助的人:1051万
展开全部
  1. 关于成员数据。如果处理的数据结果仅仅是在当前的内存中使用,那就直接使用函数传递,也就是非成员变量,如果当前处理的数据需要传递给其它的模块(通常是动态库DLL),那么最好是将其保存为成员变量,存储在公共内存区,这样方便数据的共享。

  2. 关于成员函数。如果当前函数仅仅完成一个单独的任务,不需要调用其它函数,则将其设为独立的与类无关的函数,如果当前函数需要与类内的某些函数交互,则将其设为成员函数。

  3. 这些都需要在实战中思考,才能理解。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
阳顶天鹿鼎记
2013-09-02 · TA获得超过502个赞
知道小有建树答主
回答量:675
采纳率:100%
帮助的人:403万
展开全部
类是具有一定特性的,这个对文件操作就具有一定的特性,对文件进行读写,并对内容进行处理,所以这里可以应用类,那么这个类的实例就是一个可以对文件进行操作并且处理的对象。把这些方法封装起来,用起来比较方便,好管理,如果是C++代码,最好是封装起来变成类,这是C++的特性,用特定的对象完成对应的功能,需要干什么,只需要一个类的实例化即可,而C语言是过程性的,可以用到什么的时候直接调用普通函数。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
夜神梦无眠
2013-09-02 · TA获得超过3357个赞
知道小有建树答主
回答量:968
采纳率:63%
帮助的人:427万
展开全部
你的意思是不是:比如player 继承role类,而role类的成员与player一模一样,为什么不直接写在player,而还要继承调用怎么麻烦是吗?

你直接写player类也可以,但以后游戏做大了调用就很不利,比如出现一个monster类,npc类,就不必再重复的写成员函数,而是直接继承role类。

游戏写的越大,就要分的越细,函数功能就不能太强大
更多追问追答
追问
不是,想问的是普通函数和成员函数的用法差别。(这里的成员函数所在的类操作的不是类中的成员变量)
追答
你的意思是: 他再其他类修改另一个类的成员变量?而为什么不直接在本类修改?

那这个东西就没有统一的标准了,比如 player 的 HP为private 。

而技能对player造成伤害 可以直接再玩家里写 玩家掉血函数,传“技能伤害值"

也可以在技能里 直接setplayerHP 直接改变HP的值, 看自己如何理解了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hsfwms
2013-09-02
知道答主
回答量:4
采纳率:0%
帮助的人:5719
展开全部
类成员的函数还有一个作用就是命名空间
更多追问追答
追问
怎么说?可以详细一点么?谢谢。
追答
命名空间可以避免函数名重复。也利于对函数进行归类。如果全部都是全局函数,数量很多的话就会很乱。这可能是从程序的整体架构上考虑吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式