zoukankan      html  css  js  c++  java
  • [技术]浅谈c++ this指针

    背景

    matrix operator*=(const matrix &a){
        *this=*this*a;
        return *this;
    }

    XXX:诶,你这个*this是什么啊,是指针吗

    博主:啊啊啊?这个问题= =(唔),我马上去写博客,你来我博客上看吧= =

    基本介绍

    照例引度娘:

    一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。

    仍然是不清楚的?没关系,我们先看代码:

    struct matrix{
        int data[2][2];
        matrix operator*(const matrix &a){
            matrix tmp;
            for(int i=0;i<2;i++)
                for(int j=0;j<2;j++){
                    tmp.data[i][j]=0;
                    for(int k=0;k<2;k++)
                        tmp.data[i][j]+=data[i][k]*a.data[k][j];
                }
            return tmp;
        }
    };

    我们注意到,我们在函数中用了三个matrix变量,但是我们注意到,再调用data数据成员时,我们写了这样三句话:

    tmp.data[][]
    a.data[][]
    data[][]

    问题来了,最后一行的data是属于哪个结构体变量的呢,显然,我们是通过另一个对象来调用的重载乘号(关于重载,我会另写一篇文章),那么,显然这个data就是属于这个对象的,事实上,我们可以这样认为最后一句话的data的调用:

    (*this).data[][]//或this->data

    终于引入到this了= =

    this指针,指向的就是对象本身的地址,并将其作为一个隐含参数传递给函数,也就是说,当我们各种调用对象内部的数据成员时,我们就可以认为,自己隐式调用了this指针来完成对对象的调用。

    *this则是对this的解引用,也就是说,this原本是指向对象本身的指针,而*this就代表了对象本身

    如何使用

    1. 其实你在非静态成员函数中调用非静态数据成员时,就已经使用了this指针进行了对数据成员的调用
    2. 重载操作符时的使用可以使代码更加简洁
    3. 当参数与对象数据成员变量名相同时必须显式调用this指针,否则会出现参数自赋值的情况,且数据成员并未被赋值
    4. 等等......

    总结

    this指针是一个神圣的指针,不在必须修改它的情况下不要轻易修改它

    ——《c++面向对象高效编程》

    其实this指针也没那么神秘,当你了解了它之后,就可以更好地使用它,使用对象,使用c++了

  • 相关阅读:
    SPOJ 1812 LCS2 后缀自动机
    [APIO2014]回文串 后缀自动机_Manancher_倍增
    SPOJ8222 NSUBSTR
    [HAOI2016]找相同字符 广义后缀自动机_统计出现次数
    洛谷 P3804 【模板】后缀自动机 统计单词出现次数
    洛谷 P1368 工艺 后缀自动机 求最小表示
    力扣题目汇总(反转字符串中的单词,EXCEL表列序号,旋置矩阵)
    力扣题目汇总(重复N次元素,反转字符串,斐波那契数)
    力扣题目汇总(机器人返回原点,按奇偶排序,数字的补数)
    博客园美化的第二天(动态设置,以及结合ps制作)
  • 原文地址:https://www.cnblogs.com/hzoi-mafia/p/7289474.html
Copyright © 2011-2022 走看看