struct foo
{
int val;
void bar( void )
{
cout << val << endl;
}
};
foo a;
a.bar();
你可以看成是:
struct foo
{
int val;
};
void bar( foo& obj )
{
cout << obj.val << endl;
}
foo a;
bar( a );
基本上可以按照上面的理解,成员函数不占有类的空间,也就是说这些成员函数只是我们程序员与编译器之间的约定而已,编译器与机器码之间没有成员函数与一般的函数之分,所有的成员函数都会被编译成为一般的全局性的函数(就如楼上所说的形式),成员的约定只是用于编译器判断那些对象可以调用那些函数而已,在调用的时候编译器只要把调用语句编译成跳转到该“成员”函数的地址即可,没有必要把这个指针放到类中。
非虚拟的成员函数在编译阶段就可以确定函数的地址,所以它没有必要占用类的空间,而虚拟的成员函数需要在执行阶段才能确定函数的位置,所以需要在类中存放着虚拟的成员函数的指针