this指针 (保存调用成员函数对象的地址)
Posted Qing-Huan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了this指针 (保存调用成员函数对象的地址)相关的知识,希望对你有一定的参考价值。
1. 在调用成员函数前,先将对象地址存入 ecx
寄存器,进入函数后将 ecx
压栈保存对象地址,当需要用到 this指针
时,再弹栈取出赋值给函数内部自带的一个 this指针
2. 数据成员是由 this指针
+偏移取到的。类的对齐规则和结构体一致
3. 静态成员函数没有 this指针
4. 若函数形参和成员名同名,需要使用 this指针
指向成员名,否则根据变量重名的就近原则,只会操作形参。
5. 如果成员函数返回 *this
可以完成链式操作
07. this指针,构造和析构,new和delete
一.this指针
1.不同的对象,数据成员是独有的,成员函数是共享的
2.调用成员函数的时候,会默认传入this指针,this指针指向了调用函数的对象的首地址
3.this通过ecx传递,调用约定 __thiscall
4.成员函数的调用约定可以修改
5.this指针是class *const this
二.构造和析构
构造函数:函数名和类型相同,无返回值,可以有参数,可以有默认参数,可以重载
析构函数:函数名和类名相同,前面加~,无返回值,无参数,无法重载
构造和析构函数可以手动调用,调用格式:类名::函数名。例如:
auto foo=HasPtr::HasPtr("11");//手动调用构造函数 foo.HasPtr::HasPtr("22222");//再次手动调用构造函数 foo.~HasPtr();//手动调用析构函数
构造和析构的调用时机:
构造在对象声明周期的开始被调用
析构在对象声明周期的结束被调用
三.new和delete
使用malloc在堆中手动实例化对象:
HasPtr *p = (HasPtr *)malloc(sizeof(HasPtr)); p->HasPtr::HasPtr("asdf");//手动调用构造函数 p->~HasPtr();//手动调用析构函数 free(p);
new和delete在堆中自动实例化对象:
HasPtr *p = new HasPtr("111");//先申请内存,再调用构造函数 delete p;//先调用析构函数,再释放内存 HasPtr 占用12字节
new[]和delete[]:
HasPtr *p = new HasPtr[5];//先申请内存,再调用构造函数
new[] 额外保存了对象个数:
强调:
new和delete配对使用
New[]和delete[]配对使用
以上是关于this指针 (保存调用成员函数对象的地址)的主要内容,如果未能解决你的问题,请参考以下文章