• C++中this指针的用法


    this指针抽象比喻

        当我们在进入一个房子之后, 可以看见房子里的桌子,椅子、 地板等,但是看不到房子的全貌。对于一个类的实例来说, 你可以看到它的成员 函数、 成员 变量, 但是实例本身呢? this是一个指针, 它时时刻刻指向这个实例,通过this指针操作实例。

        一个对象的多个成员就可看作是这个对象所拥有的桌子,椅子、 地板等;而在很多个对象中间,我们为了证明某个成员是自己的成员,而不是其他对象的成员,我们同样需要给这些成员取上名字。在C++中,我们利用this指针帮助对象做到这一点,this指针记录每个对象的内存地址,然后通过运算符->访问该对象的成员

    程序例程

       话不多说我们通过一个程序来体现this指针的实际用处:

    #define _CRT_SECURE_NO_WARNINGS 1
    #include<iostream>
    #include<string.h>
    
    using namespace std;
    
    class Student
    {
    public:
        void Initstudent(char* name, char* gender, int age)
        {
            cout << "this指针保存的地址为:"<< this << endl;
            strcpy(this->_name, name);
            strcpy(this->_gender, gender);
            this->_age = age;
        }
    
    private:
        char _name[20];
        char _gender[15];
        int _age;
    };
    int main()
    {
        Student S1, S2, S3;
        cout << "当前对象S1地址为:" << &S1 << endl;
        S1.Initstudent("张三","boy",18);
    
        cout << "当前对象S2地址为:" << &S2 << endl;
        S2.Initstudent("李四","man", 101);
    
        cout << "当前对象S3地址为:" << &S3 << endl;
        S3.Initstudent("王五","lady", 20);
        getchar();
        return 0;
    }

      结果显示如下:

       通过这个输出结果,我们可以看到,对象S1、S2、S3、的内存地址和this指针的地址分别是一模一样的。这就说明了this指针变量记录的是当前对象的内存地址,this指针指向当前的对象!

          在程序里,我们就用了this指针的这个属性,即:this->i=x;这句话就表示把x的值赋值给当前的对象的私有成员函数i。

    this指针特性详解 :

    1、 this指针的类型  类类型 *const

    2、 this指针并不是对象本身的一部分,不影响sizeof的结果。

    3、 this的作用域在类成员函数的内部(不严谨) 。

    4、 this指针是类成员函数的第一个默认隐含参数, 编译器自动维护传递,不能显式传递。

    5、 只有在类的非静态成员函数中才可以使用 this指针,其它任何函数都不可以 。

       this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说, 即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。

    this指针的使用

       一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;

    另外一种情况是当参数与成员变量名相同时,如this->n = n 。

    问题: this指针有没有可能为NULL呢?

     1     #include<iostream>  
     2     using namespace std;  
     3       
     4     class A  
     5     {  
     6     public:  
     7         void test();  
     8     private:  
     9         int x;  
    10     };   
    11     void A::test()  
    12     {  
    13         cout<<this<<endl;  
    14     }  
    15       
    16     void Funtest()  
    17     {  
    18         A *a = NULL;  
    19         a->test();  
    20     }  
    21     int main()  
    22     {  
    23         Funtest();  
    24         system("pause");  
    25         return 0;  
    26     }  

    输出结果:

    所以this指针可以为空。
    问题: 为什么叫this指针,而不是引用呢?

    因为this指针存放当前正在调用对象的地址,而引用则是某个对象的别名,和该对象占同一块空间地址,二者区别还是蛮大的。

    __thiscall调用约定:
    a、__thiscall只能够用在类的成员函数上。
    b、参数从右向左压栈。
    c、如果参数个数确定, this指针通过ecx传递给被调用者; 如果参数不确定, this指针在所有参数被压栈后压入堆栈。
    d、对参数个数不定的, 调用者清理堆栈, 否则函数自己清理堆栈。

  • 相关阅读:
    Java并发/多线程-线程池的使用
    pam详解
    chrony时间同步服务
    网站每日UV数据指标去重统计
    阻塞式发送邮件
    待办事项-redis
    解决Windows7、Windows10 ping不通的问题
    redis序列化和反序列化的操作-(以前咋操作我都忘记了)
    秒杀活动下的公平队列抢购机制
    控制某个字段不在页面展示
  • 原文地址:https://www.cnblogs.com/33debug/p/6539569.html
Copyright © 2020-2023  润新知