【C++】一篇文章加深对this指针的理解

冷不防 2022-12-18 00:57 269阅读 0赞

文章目录

  • this指针
    • 什么是this指针?
    • 验证编译器暗地中将本对象地址传入函数
    • this指针特点
    • this指针的应用场景

this指针

什么是this指针?

this:是一个指针,这个指针中保存的是当前对象的地址,指向本对象

作用域:非静态成员函数内部

用途:当类的非static成员函数访问非static成员变量时,编译器会自动对象本身的地址作为一个隐含的形参传给函数(也就是说:即使你没有显式的将本对象地址传入函数中,编译器在编译的时候也会自动将本对象地址传给函数),访问各个成员均可以通过this进行

验证编译器暗地中将本对象地址传入函数

验证程序

  1. #include <iostream>
  2. using namespace std;
  3. class Studen
  4. {
  5. public:
  6. Studen(){ }
  7. ~Studen(){ }
  8. void initializeStudent(string name, int id)
  9. {
  10. this->Name = name;
  11. this->ID = id;
  12. }
  13. private:
  14. string Name;
  15. int ID;
  16. };
  17. int main()
  18. {
  19. Studen s1, s2;
  20. s1.initializeStudent("小明", 001);
  21. s2.initializeStudent("小李", 002);
  22. system("pause");
  23. return 0;
  24. }

在这里插入图片描述

由上述程序的运行initializeStudent函数的汇编代码可以看出:在s1和s2分别调用initializeStudent函数时,编译器分别将s1的地址和s2的地址分别传入了initializeStudent函数中,由此可见,虽然编写程序的人未显式将本对象地址传入函数中,编译器暗地里将本对象的地址传入了函数

所以下面两个函数是等价的

  1. void initializeStudent(string name, int id)
  2. {
  3. this->Name = name;
  4. this->ID = id;
  5. }
  6. void initializeStudent(Studen* This, string name, int id)
  7. {
  8. This->Name = name;
  9. This->ID = id;
  10. }

this指针特点

  • 只能在类的非static成员函数中使用

由下图可以看出:this只能在非静态成员函数中使用

原因:静态成员函数的调用不依赖于对象

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wpdX9eE5-1603532860156)(C:\\Users\\1111\\AppData\\Roaming\\Typora\\typora-user-images\\image-20201024171705703.png)\]

  • this指针的数据类型:类名* const this

    \[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xBixuqFb-1603532860158)(C:\\Users\\1111\\AppData\\Roaming\\Typora\\typora-user-images\\image-20201024173312598.png)\]

  • this指针主要通过ecx寄存器来传递

在这里插入图片描述

  • this指针的指向不可以改变

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iZSMoPLf-1603532860163)(C:\\Users\\1111\\AppData\\Roaming\\Typora\\typora-user-images\\image-20201024173555194.png)\]

试图修改this的指向时报错误:

错误 1 error C2106: “=”: 左操作数必须为可修改对的左值

说明this不可修改指向

  • this指针并非成员变量,所以不影响类的大小

this指针的应用场景

  • 场景一:获取本对象的地址

    include

    using namespace std;
    class A
    {
    public:

    1. void getAdd()
    2. {
    3. cout << "a1内存地址为:" << this << endl;
    4. }

    };
    int main()
    {

    1. A a1;
    2. cout << "a1内存地址为:" << &a1 << endl;
    3. a1.getAdd();
    4. system("pause");
    5. return 0;

    }

输出:

a1内存地址为:00F6FD2B
a1内存地址为:00F6FD2B

  • 场景二:区别形参与成员变量

    class Student
    {
    private:

    1. char Name[10];
    2. int ID;

    public:

    1. Student(){ }
    2. Student(char *Name, int ID)
    3. {
    4. strcpy(this->Name, Name);
    5. this->ID = ID;
    6. }

    };

在形参和成员变量名字一样的情形下,可以使用this来区别变量名字

  • 场景三:获取当前对象本身

    Student getObj()

    1. {
    2. return *this;
    3. }

发表评论

表情:
评论列表 (有 0 条评论,269人围观)

还没有评论,来说两句吧...

相关阅读

    相关 c++this指针

    c++的对象里有一个指针一直指向他自己,这个指针就是this指针,这个指针是在类的成员函数内部隐式调用的。可以认为在类调用成员函数的时候,编译器会自动的在参数列表的最后一个位置

    相关 C++指针理解

    指针对象指向某一处地址,如果你希望赋值以后初始的更改了指针对象的值也发生更改的话就用指针吧。对于指针的初始化下面说的这两种方式的结果是不同的,`c=&a`和`c=a` ,在

    相关 C++中this指针理解

    首先要理解class的意思。class应该理解为一种类型,象int,char一样,是用户自定义的类型。(虽然比int char这样build-in类型复杂的多,但首先要理解它们