this指针
1.this概念:类非静态成员函数的第一个隐藏的函数,该参数使用指向调用当前函数的对象
2.this指针特性
a.this指针类型 T*const
- 普通类型成员函数:T* const
可以修改对象的内容
可以调用普通和const类型的成员函数 - const类型成员函数:const T* const
this指向不能修改并且指向对象中的内容也不能修改
只能调用const类型的成员函数
b.this是非静态成员函数的第一个隐藏函数(用户在编写函数时不用给出this的参数,该参数是由编译器自己维护,调用该函数也不需要手动传递,this指针的传参可以有编译器自动完成)
c.this指针只存在于正在运行的成员函数中,this指针不会存在于对象中
d.静态成员函数没有this指针,不是和对象相关的函数,是类的属性
e.this指针的传递:一般情况ecx寄存器(this_call:调用约定)也可能通过参数压栈的方式进行传递:push 对象地址 比如:类中如果包含不定参数的成员函数
有哪些调用约定?这里不具体介绍,后面在C++函数的调用规则中再介绍。
C++函数的调用规则
3.this指针是否可以为空
a.如果成员函数是通过对象的方式进行调用,this指针一定不会是空:
T t;
t.TestFun();
b.如果成员函数是通过类类型的指针方式进行调用,this指针可能会为空:
T t;
T* pt=&t;
pt->TestFun();
pt=nullptr;
pt->TestFun();
其中pt=nullptr; pt->TestFun(); 代码可以通过编译,但是在运行期间可能会出现错误。如果在成员函数中没有访问非静态成员变量,一定不会崩溃,如果访问任何非静态成员变量,代码一定会崩溃
4.this指针位置:栈
类的编译过程:
1.识别类名
2.识别类中的成员
3.识别类中的成员函数,并对成员函数进行改写
a.给非静态的成员函数增加隐藏的this指针参数
b.对成员函数中每个访问非静态成员变量前增加this
一道面试题:
该代码是否有问题?
class A
{
public:
~A()
{
delete this;
}
};
可以从编译、运行两个方面来看。
编译:没有任何语法问题,编译通过
运行时:代码崩溃。无限递归,造成栈溢出而导致代码崩溃
delete:
1.调用析构函数,清理对象中的资源
2.释放指针所指向的堆空间
类中6个默认的成员函数:
1.什么是默认的成员函数:如果用户没有显示定义该成员函数,编译器将会自动生成一个
2.默认的成员函数都有哪些?
构造函数、析构函数、拷贝构造函数、赋值运算符重载函数、取地址操作符重载、const修饰的取地址操作符重载。
构造函数
a.概念:
是一个特殊的成员函数,函数名必须与类名相同,在创建对象期间由编译器自动来进行调用,已完成对象的初始化工作,并且在对象的整个生命周期内只调用一次。因此初始化只需要初始化一次
b.特性
- 函数名必须与类名相同
- 没有返回值