温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

this指针

发布时间:2020-08-02 03:34:12 来源:网络 阅读:311 作者:汇天下豪杰 栏目:编程语言

1、C++中在实例化对象之后:

class Test{};

  用sizeof(Test)计算类的大小,可以知道只有数据成员的大小,并没有方法的大小,

  因为其数据各自保存,而成员方法共用一份。

this指针

那么每个对象在调用方法是怎么会知道是自己的数据成员呢?

2、this指针使用时机

  this指针是由编译器所造,真实的隐藏在内部。

#include<iostream>
using namespace std;

class Test{
public:
    void setData(int x){
        data = x;
    }
    int getData(){
        return data;
    }
private:
    int data;
};
int main(void){
    Test t1;
    int value;
    
    t1.setData(3);
    value = t1.getData();
    cout<<value<<endl;
    
    return 0;
}

以上的这个程序,其实内部就隐藏了this指针,万一函数如下呢:

void setData(int data){
    data = data;
}

此时参数名字和数据类型名字一样,那么编译器只会认为是形参给形参赋值,会出错!

解决方案:

void setData(int data){
    this->data = data;
}

此时this->data指的就是当前对象的data。

this的使用时机:当参数名字和要赋值的数据成员同名时;使用this。

3、this指向当前对象的本质

  C++中编译器对类的编译顺序:(1)、先识别类名;(2)、在识别所有的数据成员(包括私有、公有、保护) ;(3)、识别方法,并且重写方法。

void setData(int data){
    this->data = data;
}
...........

t1.setData(3);

上面的代码本质,有个隐藏的参数传递,其编译器改写的函数如下:

t1.setData(3)---->  setData(&t1, 3);

      void setData(Test *this, int data){}

相当于函数有一个隐式参数,但是程序不能那样写,必须写其对象调用的形式(知道本质,却不能写本质形式),否则会报错。

C++中就是通过这个this指向当前对象,从而区分了不同对象的数据成员;

但问题远没有这么简单,再看下面的代码:

void setData(int data){
  this = NULL;
  this->data = x;
}

此时代码将出现问题,万一不小心给this = NULL;此时将会报错,编译根本无法通过,

但是,发明C++的人,不会让你给this赋值,这就的对this本质在此剖析:

怎样才能不更改this的值呢?改写函数:

t1.setData(3)---->  setData(&t1, 3);

        void setData(Test * const this, int data){}

这才是this的本质,其const修饰,为常量的,不可更改!

只要对象调用方法(普通方法),必然会有隐式的函数改写,其this的本质一目了然!



向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI