注册 登录
编程论坛 C++教室

普通成员函数不属于类

vfdff 发布于 2010-08-16 21:58, 1415 次点击
程序代码:
#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));说明普通成员函数不属于类,静态成员函数才属于类!
3 回复
#2
东海一鱼2010-08-16 22:55
类成员函数本来就不属于类啊。只是编译期早绑定到对象上罢了。
#3
pangding2010-08-17 00:42
概念上肯定是属于类的。但是只有静态对象可以通过类名调用,其它的只能通过实例调用。这两种调用方法本质上有很大区别。

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

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


而静态成员,是全部类的实例共享的,相当于 C 里全局变量的味道。它的地址的编译时可以写死,不存在日后动态分配,包括分配在栈里的情况。因此在語法上,它享有更多的优惠的政策。
#4
vfdff2010-08-17 01:21
回复 2楼 东海一鱼
难怪算类的大小时,和成员函数个数基本上不相干,除非虚函数之类增加个表的空间
1