12-this

14 篇文章 0 订阅
11 篇文章 0 订阅

this是指向当前对象的指针
◼ 对象在调用成员函数的时候,会自动传入当前对象的内存地址


#include <iostream>
using namespace std;

//struct Person {
//	int m_age;
//
//	/*void run(Person *person) {
//		cout << "Person::run() - " << person->m_age << endl;
//	}*/
//
//	void run() {
//		// this指针存储着函数调用者的地址
//		// this指向了函数调用者
//
//		// cout << "Person::run() - " << this->m_age << endl;
//
//		// this->m_age = 3;
//		m_age = 3;
//		/*
//		// ebp-8是this指针的地址
//		mov         dword ptr [ebp-8],ecx
//		mov         eax,dword ptr [ebp-8]
//		mov         dword ptr [eax],3
//		*/
//	}
//};

void func() {

}

struct Person {
	int m_id;
	int m_age;
	int m_height;

	void display() {
		// 中断:interrupt
		// cc -> int3 :起到断点的作用
		// int3int3int3
		// eax == &person.m_age == &person + 4
		// mov eax, dword ptr [this]
		// [eax]、[eax + 4]、[eax + 8]
		// [&person + 4]、[&person + 4 + 4]、[&person + 4 + 8]
		cout << "id = " << m_id
			<< ", age = " << m_age
			<< ", height = " << m_height << endl;
	}
};

void test() {
	Person person;
	person.m_id = 10;
	person.m_age = 20;
	person.m_height = 30;
	person.display();

	Person *p = &person;
	p->m_id = 10;
	p->m_age = 10;
	p->m_height = 10;
// Person *p = &person;
// ebp-14h是person对象的地址
lea         eax,[ebp-14h]  
// ebp-20h是指针变量p的地址
mov         dword ptr [ebp-20h],eax  

// eax存储的是person对象的地址,也就是person.m_id的地址
// p->m_id = 10;
mov         eax,dword ptr [ebp-20h]  
mov         dword ptr [eax],0Ah  

// p->m_age = 10;
mov         eax,dword ptr [ebp-20h]  
mov         dword ptr [eax+4],0Ah  

// p->m_height = 10;
mov         eax,dword ptr [ebp-20h]  
mov         dword ptr [eax+8],0Ah  

mov         ecx,dword ptr [ebp-20h]  
call        003B141F

// 原理:如何利用指针间接访问所指向对象的成员变量?
1.从指针中取出对象的地址
2.利用对象的地址 + 成员变量的偏移量计算出成员变量的地址
3.根据成员变量的地址访问成员变量的存储空间

	p->display();
}

// 调用函数的时候,需要分配额外的存储空间来存储函数内部的局部变量
void test5() {
	int a = 10;
	a += 20;
	int b = 20;
	int c = 30;
}

int main() {
	test5();

	Person person;
	person.m_id = 10;
	person.m_age = 20;
	person.m_height = 30;

	Person *p = (Person *) &person.m_age;
	// eax == &person.m_age == &person + 4
	// mov eax, dword ptr [p]
	// mov dword ptr [eax + 0], 40
	// mov dword ptr [&person + 4 + 0], 40
	p->m_id = 40;
	// mov dword ptr [eax + 4], 50
	// mov dword ptr [&person + 4 + 4], 50
	p->m_age = 50;

	// 将person对象的地址传递给display函数的this
	// person.display();

	// 会将指针p里面存储的地址传递给display函数的this
	// 将&person.m_age传递给display函数的this
	p->display();

	cout << 0xCC << endl;



	getchar();
	return 0;
}

#include <iostream>
using namespace std;


void func()
{}

class Person 
{
public:
	int m_age;
	void run()
	{
		cout << "m_age = " << m_age << endl;
	}

};
int main()
{
	func();
	Person person1;
	person1.m_age = 10;
	person1.run();
//===================================================	
		func();
00402752  call        0040103C  
	Person person1;
	person1.m_age = 10;
00402757  mov         dword ptr [ebp-0Ch],0Ah  
	person1.run();
0040275E  lea         ecx,[ebp-0Ch]  
00402761  call        00401366
//============================================

	cin;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值