| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1415 人关注过本帖
标题:普通成员函数不属于类
只看楼主 加入收藏
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
收藏
已结贴  问题点数:10 回复次数:3 
普通成员函数不属于类
程序代码:
#include <malloc.h>
#include <stdio.h>
#include <string.h>

class stub
{
public :
      int test1(int a) { return a; }
      static int test2(int a) { return a; }
};
   
int main(int argc,char** argv)
{
        class stub *tmp = new stub;
    printf("value = %d\n", tmp->test1(4));
    printf("value = %d\n", stub::test2(4));
    delete tmp;
    return 0;
}
printf("value = %d\n", stub::test(4));错误,只能使用
printf("value = %d\n", tmp->test(4));说明普通成员函数不属于类,静态成员函数才属于类!
搜索更多相关主题的帖子: 函数 成员 
2010-08-16 21:58
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:2 
类成员函数本来就不属于类啊。只是编译期早绑定到对象上罢了。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-08-16 22:55
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:8 
概念上肯定是属于类的。但是只有静态对象可以通过类名调用,其它的只能通过实例调用。这两种调用方法本质上有很大区别。

你代码里写的那两种用法应该都是对的,但你底下搞的那个好像有点……

你可能不太清楚成员函数的调用方式。在编译阶段,必须生成可执行代码,类的成员函数代码只生成一份,共所有类的实例调用。每个实例并不拷贝函数体的副本。
由编译器负责在对象调用时,传递 this 指针作为隐式参数。里面所有涉及的非静态成员,全部传换成 this->... 的形式。
这就是为什么我说的,你即使有函数的入口地址也不能自己调用的原因,因为你不知道编译器传 this 指针的协议是怎样的。而且,当你使用对象调用函数时,编译把按类型调用函数指针表中的索引。这就是为什么用基类对象的指针调用时,调用的是基类函数的原因,即使这个函数在子类中被覆盖。但是可以利用虚函数的語法来改变这个結果,这其实是考多级函数指针实现的。
类成员函数的调用比较复杂,所以我知道拿它的地址本质上来说没什么作用。但是为了解决这个问题,也给出了类成员函数指针的这种特殊語法,在你那个帖子里我也提了。你仔细看看肯定能看出来这两个有什么不同。即使如此,我也强调,这种語法是生僻的語法,并不实用。当然知道没什么坏处,万一将来真发现有个地方用这个正好,用用是可以的。


而静态成员,是全部类的实例共享的,相当于 C 里全局变量的味道。它的地址的编译时可以写死,不存在日后动态分配,包括分配在栈里的情况。因此在語法上,它享有更多的优惠的政策。
2010-08-17 00:42
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 2楼 东海一鱼
难怪算类的大小时,和成员函数个数基本上不相干,除非虚函数之类增加个表的空间

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-08-17 01:21
快速回复:普通成员函数不属于类
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028109 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved