一、this指针
首先需要知道this指针是什么?
this指针是指向本类对象的指针,它的值是当前被调用的类的成员函数所在的对象的起始地址。
作用:保证不同对象的成员函数引用数据成员时,引用的数据成员是指定的对象的数据成员。
我们也可以通过C语言与C++语言结构体和类的对比来进一步理解this指针
结构体;
struct Student
{
char *_name;
char *_gender;
int age;
};
void Init_info(struct Student *stu)
{
stu->_name = "nihao";
stu->age = 18;
stu->_gender = "女";
}
int main()
{
struct Student student;
Init_info(&student);
return 0;
}
类:
class Student
{
public:
void Init_info()
{
_name = "niaho";
_gender = "女";
_age = 18;
}
private:
char *_name;
char *_gender;
int _age;
};
int main()
{
Student stu;
stu.Init_info();
return 0;
}
this指针的特性:
1.this指针的类型 (一般来说:类类型 * const)
在非const成员函数中它的类型是指向该类类型的指针,在const 成员函数中是指向const 类类型的
指针,而在volatile 成员函数中是指向volatile 类类型的指针。
2.this指针并不是对象本身的一部分,不影响sizeof的结果。(因为sizeof计算的是类成员数据所占空间字节数,而 this指针是类成员函数的参数).
3.this指针的作用域在类成员函数的内部 ( 原因:因为this指针是类成员函数的参数)
4.this指针是类成员函数的第一个默认隐含参数,编译器自动维护传递。
this指针遵循的调用约定_thiscall:
a._thiscall只能够用在类的成员函数上;
b.参数从右到左传递;
c.如果类成员函数参数个数确定,this指针通过ecx寄存器传递给被调用者,(_thiscall的调用约定)
如果类成员函数参数不确定,this指针在所有参数被压栈后压入堆栈(_cdecl的调用约定);
this指针一般是隐式使用,但在需要的情况下也可以显示的使用
例如:
#include<iostream>
using namespace std;
class Box
{
public:
//申明有默认参数的构造函数,用参数初始化列表初始化数据成员
Box(int h = 10,int w = 12,int len = 15)
:_height(h)
,_width(w)
,_length(len)
{}
int volume()
{
return (_height*_width*_length); //隐含使用this指针
return (this->_length *this->_width*this->_length); //显示使用this指针
return((*this)._height*(*this)._width*(*this)._length); //显示使用this指针
}
private:
int _height;
int _width;
int _length;
};
int main()
{
int ret = 0;
Box b1(10,10,10);
ret = b1.volume();
cout<<ret<<endl;
getchar();
return 0;
}
this指针有关的拓展问题:
① 为什么用this指针指向对象,而不是引用?
因为this指针要比引用早出现
②this指针也有可能为NULL,当this指针为空时,调用类的成员函数是不会出错,
但访问非静态成员数据时程序崩溃。
编译器识别类的过程:
1.识别类名;
2.识别类名中的数据成员;
3.识别类中的成员函数并对函数进行改写(改写是指显示使用this指针,不过这是编译器的底层操作)。