系统基于32位,MSVC编译器,VS开发工具
1、通过对象对成员函数的调用,默认会给参数传进去一个this指针,该指针为对象的首地址,这个过程通常被编译器隐藏起来了。
对象直接调用成员函数,编译器在编译器就会直接获取到函数地址,汇编语言生成的就是call 函数地址,会有一个寄存器(很多情况是ECX)保存对象的地址,也就是相当于源码中的this指针。
函数代码里面可以直接通过该this指针(寄存器+成员偏移)访问到成员数据。这种调用属于直接函数调用,静态绑定行为。
class TypeA {
public:
char a1 = 10;
int a2 = 20;
void TypeA_Method() {
this->a1 = 20;
a1 = 20;//这两种方式一样的,实际这个也会转换成上面的形式使用
}
};
void TypeA_Method(TypeA* thisptr) {
thisptr->a1 = 20;
}
int main()
{
TypeA a_obj;
a_obj.TypeA_Method();//a_obj对象调用TypeA_Method函数,相当于下面的写法
TypeA_Method(&a_obj);
return 1;
}
|
|
2、通过类型的对象直接调用成员函数,不受继承,虚函数,是否重写过的影响,都是很简单的调用该类型中的成员函数,编译器都是直接生成了call 函数地址,属于静态绑定。
class TypeA {
public:
char a1 = 10;
int a2 = 20;
void virtual TypeA_Method() {
this->a1 = 20;
}
};
class TypeB :public TypeA {
public:
char b1 = 30;
int b2 = 40;
void virtual TypeA_Method() { //重写了TypeA中的成员函数
this->a1 = 40;
}
};
int main()
{
TypeA a_obj;
TypeB b_obj;
a_obj.TypeA_Method();//执行TypeA中的TypeA_Method函数
TypeA a2_obj= b_obj;
a2_obj.TypeA_Method();//同上个函数一模一样,不会调用重写的那个函数
return 1;
}
|
|