this指针作为一个隐含参数传递给非静态成员函数,用以指向该成员函数所属类所定义的对象。
在C++中,编译器是如何识别一个类的呢?分为以下三步:
1、识别类名
2、识别类数据成员
3、编译函数并且对函数进行重写
看下面这段代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class Person
{
public:
void InitPerson(char* name, char* sex, int age)
{
strcpy(_name, name);
strcpy(_sex, sex);
_age = age;
}
void Print()
{
cout << _name << " " << _sex << " " << _age << endl;
}
private:
char _name[20];
char _sex[5];
int _age;
};
int main()
{
Person person1;
Person person2;
Person person3;
person1.InitPerson("zhao", "nan", 12);
person2.InitPerson("qian", "nan", 14);
person3.InitPerson("li", "nv", 18);
person1.Print();
person2.Print();
person3.Print();
system("pause");
return 0;
}
所有函数都公用同一个函数,那系统如何区分调用person1 2 3 中的哪个的对应数据呢?
类的大小包括非静态数据成员而不包括成员函数。
类中成员函数和数据成员的存储方式:成员函数在类外单独存放,并且同类的对象共用一份成员函数。
这里引入this指针。this指针时刻指向当前对象
this指针的特性:
1、this指针的类型:类类型* const
2、this指针并不是对象本身的一部分,不影响sizeof的结果
3、this指针是非静态成员函数的第一个隐含指针形参,是编译器自己处理的,我们不能在成员函数的形参中添加this指针的参数定义,也不能在调用时显示传递对象的地址给this指针
上面代码中,InitPerson函数部分重写之后为:
void InitPerson(Person* const this, char* name, char* sex, int age)
{
strcpy(this->_name, name);
strcpy(this->_sex, sex);
this->_age = age;
}
this指针的两种传参方式:
1、参数压栈:当成员函数的参数为可变时(这时遵循__cdecl调用约定)
2、ecx寄存器:当成员函数的参数固定时(这时遵循__thiscall调用约定)
此外,有关this指针还有下面两个问题:
1、this指针的实现和引用的底层实现相同,为什么还要用this指针而非引用呢?
最开始C++ 被称为带类的C,而引用是在C++1.0版才加入的。
2、this指针有没有可能为空?
定义一个指向类对象的指针,使其初始化为NULL。则这个this指针为空。