扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
1、C++中在实例化对象之后:
公司主营业务:成都网站设计、成都网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联公司推出隆德免费做网站回馈大家。class Test{};
用sizeof(Test)计算类的大小,可以知道只有数据成员的大小,并没有方法的大小,
因为其数据各自保存,而成员方法共用一份。
那么每个对象在调用方法是怎么会知道是自己的数据成员呢?
2、this指针使用时机
this指针是由编译器所造,真实的隐藏在内部。
#includeusing 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指针-创新互联
分享链接:http://kswjz.com/article/dieigi.html
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流