快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

this指针-创新互联

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

公司主营业务:成都网站设计、成都网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联公司推出隆德免费做网站回馈大家。
class Test{};

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

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

this指针

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

2、this指针使用时机

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

#include
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<

以上的这个程序,其实内部就隐藏了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的本质一目了然!

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


文章名称:this指针-创新互联
网页URL:http://6mz.cn/article/dieigi.html

其他资讯