zoukankan      html  css  js  c++  java
  • 类中函数的一个隐含参数--this指针

    为什么会有this指针呢?

    我们需要来看一段代码感受一下。

    #include <iostream>
    using namespace std;
    class Student 
    {
     public:
     void InitStudent(char *name,char*gender,int age)
     {
       strcpy(_name,name);
       stcpy(_gender,gender);
       _age = age;
     }
     private:
     char _name[20];
     char _gender[5];
     int _age = age;
    };
    int main ()
    {
        Student s1,s2;
        s1.InitStudent("chan","nv",18);//在这里为什么只要进入这个初始化函数系统就知道你要初始化的是s1,为什么呢?这个时候我们就知道了原来在类的成员函数中有一个默认的隐含指针,this。
        s2.InitStudent("xin","nan",21);
        return 0;
    }
    所以上面那个函数参数加完整的话应该为
    InitStudent(const *this,cha*name,char*gender,int *age);

    那么什么是this指针呢?

    this指针作为一个隐含参数传递给非静态成员函数,用以指向该成员函数所属类所定义的对象。当不同对象调用同一个类的成员函数代码时,编译器会依据该成员函数的this指针所指向的不同对象来确定应该一用哪个对象的数据成员。下面举一个简单例子。

    #include<iostream>
    using namespace stdclass Student
    {
        public:
        void InitStudent(char *name,char *gender,int *age)
        {
         strcpy(this->_name,name);
         strcpy(this->_gender ,gender);
         test->_age = age;//在这里为什么可以使用this这个指针呢,并没有定义啊,这就是因为,他是一个隐含的参数。
        }
    };
    int main()
    {
     Student s1,s2;
     s1.InitStudent("chan","nv",18);//在这里运行一下你就可以发现this的地址和s1的地址是相同的
     s2.InitStudent("xin","nan",21);
     return 0;
    }

    这里写图片描述
    从图片可以看出两者的地址是相同的。

    那么在类外还有没有this指针呢?

    开始已经说了this指针是类中函数的一个隐含参数,是不是呢,以下是一个小小的检测。
    这里写图片描述
    可以看出,当你在类外自己定义一个函数时,编译器根本不能能编译通过,说明它确实只能在类中使用。

    this指针有哪些特性呢

    1:this是一个指针,它时时刻刻指向你这个实例本身。
    2:this指针的类型 类类型 *const
    3 : this指针并不是对子昂本身的一部分,不影响sizeof的结果
    4:this指针的作用域在类成员函数的内部
    5:只有在类的非静态成员函数中才可以使用,其它任何函数都不可以

    this指针是怎么传参的

    1:参数个数确定,this指针通过ecx传递给调用者。
    2:参数不确定,this指针在所有参数被压入栈后再压入堆栈。
    这里会涉及到两个函数调用约定 __cdecl __thiscall

    那么什么是函数调用约定呢?

    函数调用约定是指当一个函数被调用时,函数的参数会被传递给被调用的函数和返回值会被返回给调用函数。它就是用来描述参数是怎么传递和由谁平衡堆栈的。

    __cdecl

    参数是从右向左传递的,参数个数固定,由函数本身清理堆栈。

    __thiscall

    参数也是从右向左传递的,参数个数不定,由调用者清理堆栈。

  • 相关阅读:
    Flutter DraggableScrollableSheet 可滚动对象的容器
    Flutter 避免阻塞ui线程
    Android Kotlin 数据驱动模板
    ng mock服务器数据
    rxjs 常用的subject
    Flutter 在同一页面显示List和Grid
    dart2native 使用Dart 在macOS,Windows或Linux上创建命令行工具
    Flutter 创建透明的路由页面
    ng 发布组件库
    js实现单张或多张图片持续无缝滚动
  • 原文地址:https://www.cnblogs.com/chan0311/p/9427367.html
Copyright © 2011-2022 走看看