#include <iostream>
using namespace std;
class Test
{
public:
int a;
int b;
void print();
void s();
void ss();
void fs();
};
void Test::print()
{
//cout << "hello" << endl;
}
void Test::s()
{
}
void Test::ss()
{
}
void Test::fs()
{
}
void f()
{
int s = 3;
cout << "&s" << &s << endl;
cout << "f" << endl;
}
class B:Test
{
};
int main()
{
Test t;
cout << sizeof(t) << endl;
cout << &t.a << endl;
cout << &t.b << endl;
Test tt;
cout << &tt.a << endl;
cout << &tt.b << endl;
typedef void (Test::*p)(void);
////Test t;
////t.print();
p fun = &Test::print;
printf("%p\n",fun);
fun = &Test::s;
printf("%p\n",fun);
fun = &Test::ss;
printf("%p\n",fun);
fun = &Test::fs;
printf("%p\n",fun);
f();
cout << "--------" << endl;
B b;
cout << sizeof(b) << endl;
////((Test::*print)fun)();
//Test *p4;
//fun(p4);
// Test t;
// (t.*fun)();
// Test d;
// (d.*fun)();
}
类的成员函数不是在类实例化的时候载入内存的。应该是编译链接的时候就在程序文件中确定了相对地址。然后程序载入的时候,所有的函数都载入到内存的代码区。所以实例化对象的时候,只是申请了对象的成员变量的地址,成员函数对于所有的类对象来说,应该只有一份,在代码区共用。而且类的成员变量和成员函数不是存放在一起(地址不是连续的,是分开存放的)
Test类中的a,b变量地址是连续的,每个占4字节。但是s(),ss(),fs()不是和a,b连续的,而且,这些函数之间,好像也并不是严格连续的,改一下函数名,地址有可能会变化