C++类模型漫谈(二)

系统基于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;
}

posted @ 2022-10-19 13:14  自由小菜园  阅读(15)  评论(0编辑  收藏  举报