在这篇文章中 初识类和对象,谈到了类的初步认识和基本操作方法。
成员函数存储在公共的代码段,不同的对象调用成员函数时候,那么编译器如何知道具体操作的是哪一个对象呢?
在这里就引出了this指针。
C++编译器给每个 “非静态的成员函数” 增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过这个指针来完成的。只不过所有的操作对用户来说都是透明的,不需要用户来传递,编译器自动完成。
this
指针特性:
- 只能在“成员函数”中使用
this
指针类型: 类类型 *const (加const是为了保证,指针的指向不被更改)this
指针不存储在对象中,不影响对象大小,且始终指向当前对象this
指针是“成员函数”的第一个隐藏参数,由编译器自动给出- 主要是通过ecx寄存器来传递(并不是所有的)
例:
class Student
{
private:
char _name[20];
char _sex[5];
int _age;
public:
void StudentInit(const char *name, const char *sex, int age);
void Print();
};
其操作方法:
其最后的输出都是一样的,因为this
为隐藏指针,编译器会自动加上。
this指针可以为空嘛?
- 当以对象调用成员函数时,this指针不可能为空。
- 当以指针ptr调用成员函数时,是将ptr作为参数传递给this指针,若ptr为空,那么this指针就为nullptr
- this指针为空,成员函数可以正常调用。但若是成员函数访问了成员变量或者调用了有成员变量的成员函数,程序会崩溃。
成员变量相当于成员函数的全局变量。
但是成员变量在后,成员变量的使用在前,编译器为什么不报错呢?
编译器处理类的方法:
- 识别类名
- 识别成员变量
- 识别成员函数,并对函数进行修改----增加
this
指针