2.this指针
2.1为什么引入this指针
当我们在类中定义了一个变量,同时在类成员函数中定义了同一变量时,也就是说变量名重复时,但是我们想使用类中定义的变量,这个时候我们该怎么办呢?这个时候就是this指针大显身手的时候了。为此我们引入this指针的概念。
2.2this指针概念
- this是指向实例化对象本身时候的一个指针,里面存储的是对象本身的地址,通过该地址可以访问内部的成员函数和成员变量。this 指针是所有成员函数(包括构造函数和析构函数)的隐含参数。
- 一个对象的this指针并不是对象本身的一部分,其不会影响sizeof(对象)的结果,this指针的类型取决于使用this指针的成员函数类型以及对象类型。
- this指针的作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。换句话说就是,即使没有用this指针,编译器在编译的时候也会自动加上this的,它是一个隐含形参,对各成员的访问均通过this进行。
2.3this指针的使用
- this只能在成员函数中使用。成员函数默认第一个参数为* const this。(友元函数,全局函数不是成员函数)
- this指针不能在静态函数中使用。静态函数如同静态变量一样,他不属于具体的哪一个对象,静态函数表示了整个类范围意义上的信息,而this指针却实实在在的对应一个对象,所以this指针不能被静态函数使用。
- this指针只有在成员函数中才有定义。创建一个对象后,不能通过对象使用this指针。也无法知道一个对象的this指针的位置(只有在成员函数里才有this指针的位置)。当然,在成员函数里,你是可以知道this指针的位置的(可以&this获得),也可以直接使用的。
2.4this指针问题补充
- this指针创建时间
this 指针在成员函数的开始前构造,在成员函数的结束后清除,生命周期和其他函数参数一样。当调用一个类的成员函数时,编译器将类的指针作为函数的this参数传递进去。 - this指针存放位置
this指针会因编译器不同而有不同的放置位置。可能是栈,也可能是寄存器,甚至全局变量。 - this指针如何传递类中的函数
大多数编译器通过ecx寄存器传递this指针。在call之前,编译器会把对应的对象地址放到eax寄存器中。this是通过函数参数的首参来传递的。 - 我们只有获得一个对象后,才能通过对象使用this指针。如果我们知道一个对象this指针的位置,可以直接使用吗?
this指针只有在成员函数中才有定义。因此,你获得一个对象后,也不能通过对象使用this指针。所以,我们无法知道一个对象的this指针的位置(只有在成员函数里才有this指针的位置)。当然,在成员函数里,你是可以知道this指针的位置的(可以通过&this获得),也可以直接使用它。 - this 是 const 指针,它的值是不能被修改的,一切企图修改该指针的操作,如赋值、递增、递减等都是不允许的。
参考
https://blog.csdn.net/weixin_43751983/article/details/91147918