C++的成员函数和普通函数
有经验的能来说一下么?就是在以后的调用上,哪种更好?是这种没有数据成员的类好还是普通函数好呢? 展开
首先要知道类存在的理由,为何要面向对象。
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~
膜拜大神~~大神谦虚了,说的都很有用,受益啦!
另外想问下大神,大神贴的这个编码部分用的是什么编辑器,看的很舒服啊。
百度知道自带的编辑器,好像只有回答问题时才看得到右上角有个“代码语言”
关于成员数据。如果处理的数据结果仅仅是在当前的内存中使用,那就直接使用函数传递,也就是非成员变量,如果当前处理的数据需要传递给其它的模块(通常是动态库DLL),那么最好是将其保存为成员变量,存储在公共内存区,这样方便数据的共享。
关于成员函数。如果当前函数仅仅完成一个单独的任务,不需要调用其它函数,则将其设为独立的与类无关的函数,如果当前函数需要与类内的某些函数交互,则将其设为成员函数。
这些都需要在实战中思考,才能理解。
你直接写player类也可以,但以后游戏做大了调用就很不利,比如出现一个monster类,npc类,就不必再重复的写成员函数,而是直接继承role类。
游戏写的越大,就要分的越细,函数功能就不能太强大
不是,想问的是普通函数和成员函数的用法差别。(这里的成员函数所在的类操作的不是类中的成员变量)
你的意思是: 他再其他类修改另一个类的成员变量?而为什么不直接在本类修改?
那这个东西就没有统一的标准了,比如 player 的 HP为private 。
而技能对player造成伤害 可以直接再玩家里写 玩家掉血函数,传“技能伤害值"
也可以在技能里 直接setplayerHP 直接改变HP的值, 看自己如何理解了。
怎么说?可以详细一点么?谢谢。
命名空间可以避免函数名重复。也利于对函数进行归类。如果全部都是全局函数,数量很多的话就会很乱。这可能是从程序的整体架构上考虑吧