C++的成员函数和普通函数
答案:7 悬赏:50
解决时间 2021-01-09 11:12
- 提问者网友:你独家记忆
- 2021-01-08 17:24
C++的成员函数和普通函数
最佳答案
- 二级知识专家网友:青灯有味
- 2021-01-08 18:39
首先要知道类存在的理由,为何要面向对象。
C中的结构体就是定义一种数据格式,可以存储若干数据元素,并且它们的内存是连续的。
结构体的作用是封装一组有关联的属性,它们共同维护某种概念实体的状态。
在早期经典纯C工程当中,有经验的开发者早就开始利用结构体与函数指针实现简单的面向对象。
但是用结构体+函数指针使用不方便不灵活,所以C++最大的使命,面向对象就诞生了。
要注意的是C++与C的区别除了类之外,还有函数多态的特性、命名空间、STL等等特性。
如果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继承它,那么你的代码大致就是:
1
2
3
4
AVType* type = new AVIType(); // or MP4Type
type->decode(file);
....
type->encode(file);
当你的同类方法多起来(如rmvb、wmv、flv解码器等等).
C中的结构体就是定义一种数据格式,可以存储若干数据元素,并且它们的内存是连续的。
结构体的作用是封装一组有关联的属性,它们共同维护某种概念实体的状态。
在早期经典纯C工程当中,有经验的开发者早就开始利用结构体与函数指针实现简单的面向对象。
但是用结构体+函数指针使用不方便不灵活,所以C++最大的使命,面向对象就诞生了。
要注意的是C++与C的区别除了类之外,还有函数多态的特性、命名空间、STL等等特性。
如果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继承它,那么你的代码大致就是:
1
2
3
4
AVType* type = new AVIType(); // or MP4Type
type->decode(file);
....
type->encode(file);
当你的同类方法多起来(如rmvb、wmv、flv解码器等等).
全部回答
- 1楼网友:酒者煙囻
- 2021-01-09 00:43
类,好处;
1 :类封装性好,可以不被外部调用...
2 :用到的时候再实例化..用完直接销毁不占内存。
至于两者哪个好还得取决于这段代码多么?调用频繁么?
个人觉得类会比较好!
个人愚见追问这两点好处我是知道的。
不过我问的这个本身这个类就没有数据成员,只有成员函数。我用普通函数也不占内存啊。
调用时只要包含这个普通函数或者这个类的声明的头文件就行,这点倒是一样的。追答这个还跟公司的编程规范以及个人编码规范有关...
这算是一种良好的编码规范...
当模块繁多多,以及调用频繁的时候这种优势就体现出来了!
1 :类封装性好,可以不被外部调用...
2 :用到的时候再实例化..用完直接销毁不占内存。
至于两者哪个好还得取决于这段代码多么?调用频繁么?
个人觉得类会比较好!
个人愚见追问这两点好处我是知道的。
不过我问的这个本身这个类就没有数据成员,只有成员函数。我用普通函数也不占内存啊。
调用时只要包含这个普通函数或者这个类的声明的头文件就行,这点倒是一样的。追答这个还跟公司的编程规范以及个人编码规范有关...
这算是一种良好的编码规范...
当模块繁多多,以及调用频繁的时候这种优势就体现出来了!
- 2楼网友:七十二街
- 2021-01-08 23:20
类成员的函数还有一个作用就是命名空间追问怎么说?可以详细一点么?谢谢。追答命名空间可以避免函数名重复。也利于对函数进行归类。如果全部都是全局函数,数量很多的话就会很乱。这可能是从程序的整体架构上考虑吧追问命名空间和普通函数及类的成员函数之间没有什么联系和冲突啊。两者都可以放在不同的命名空间里啊。追答我的意思是类的函数相当于在这个类名的命名空间下的函数。只是相当于,而不是说就是命名空间。
- 3楼网友:枭雄戏美人
- 2021-01-08 22:53
你的意思是不是:比如player 继承role类,而role类的成员与player一模一样,为什么不直接写在player,而还要继承调用怎么麻烦是吗?
你直接写player类也可以,但以后游戏做大了调用就很不利,比如出现一个monster类,npc类,就不必再重复的写成员函数,而是直接继承role类。
游戏写的越大,就要分的越细,函数功能就不能太强大追问不是,想问的是普通函数和成员函数的用法差别。(这里的成员函数所在的类操作的不是类中的成员变量)追答你的意思是: 他再其他类修改另一个类的成员变量?而为什么不直接在本类修改?
那这个东西就没有统一的标准了,比如 player 的 HP为private 。
而技能对player造成伤害 可以直接再玩家里写 玩家掉血函数,传“技能伤害值"
也可以在技能里 直接setplayerHP 直接改变HP的值, 看自己如何理解了。追问是说一个类本身就没有成员变量,只有成员函数。
就是这种类咋不直接用普通函数(指的是不在类里的函数)替代呢。追答那还是面向对象的原则啊,现在没成员以后可能有的
哪怕一个游戏目前只有一个玩家角色,很多人也要写一个playerManger类
那个playerManager类还不是一样没成员变量?
你直接写player类也可以,但以后游戏做大了调用就很不利,比如出现一个monster类,npc类,就不必再重复的写成员函数,而是直接继承role类。
游戏写的越大,就要分的越细,函数功能就不能太强大追问不是,想问的是普通函数和成员函数的用法差别。(这里的成员函数所在的类操作的不是类中的成员变量)追答你的意思是: 他再其他类修改另一个类的成员变量?而为什么不直接在本类修改?
那这个东西就没有统一的标准了,比如 player 的 HP为private 。
而技能对player造成伤害 可以直接再玩家里写 玩家掉血函数,传“技能伤害值"
也可以在技能里 直接setplayerHP 直接改变HP的值, 看自己如何理解了。追问是说一个类本身就没有成员变量,只有成员函数。
就是这种类咋不直接用普通函数(指的是不在类里的函数)替代呢。追答那还是面向对象的原则啊,现在没成员以后可能有的
哪怕一个游戏目前只有一个玩家角色,很多人也要写一个playerManger类
那个playerManager类还不是一样没成员变量?
- 4楼网友:舍身薄凉客
- 2021-01-08 21:15
类是具有一定特性的,这个对文件操作就具有一定的特性,对文件进行读写,并对内容进行处理,所以这里可以应用类,那么这个类的实例就是一个可以对文件进行操作并且处理的对象。把这些方法封装起来,用起来比较方便,好管理,如果是C++代码,最好是封装起来变成类,这是C++的特性,用特定的对象完成对应的功能,需要干什么,只需要一个类的实例化即可,而C语言是过程性的,可以用到什么的时候直接调用普通函数。
- 5楼网友:你哪知我潦倒为你
- 2021-01-08 20:08
关于成员数据。如果处理的数据结果仅仅是在当前的内存中使用,那就直接使用函数传递,也就是非成员变量,如果当前处理的数据需要传递给其它的模块(通常是动态库DLL),那么最好是将其保存为成员变量,存储在公共内存区,这样方便数据的共享。
关于成员函数。如果当前函数仅仅完成一个单独的任务,不需要调用其它函数,则将其设为独立的与类无关的函数,如果当前函数需要与类内的某些函数交互,则将其设为成员函数。
这些都需要在实战中思考,才能理解。
- 6楼网友:蓝房子
- 2021-01-08 19:13
首先要知道类存在的理由,为何要面向对象。
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~追问膜拜大神~~大神谦虚了,说的都很有用,受益啦!
另外想问下大神,大神贴的这个编码部分用的是什么编辑器,看的很舒服啊。追答百度知道自带的编辑器,好像只有回答问题时才看得到右上角有个“代码语言”
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯