C++this指针的用途
this指針的用途:
1.當(dāng)形參和成員變量同名時(shí),可用this指針來(lái)區(qū)分。
2.在類的非靜態(tài)成員函數(shù)中返回對(duì)象本身,可使用return *this
每一個(gè)非靜態(tài)成員函數(shù)只會(huì)誕生一份函數(shù)實(shí)例,也就是說(shuō)多個(gè)同類型的對(duì)象會(huì)共用一塊代碼,那么問(wèn)題是:
這一塊代碼是如何區(qū)分哪個(gè)對(duì)象調(diào)用自己的呢?
C++通過(guò)提供特殊的對(duì)象指針,this指針解決上述問(wèn)題。
對(duì)象p1,p2,p3都要調(diào)用這個(gè)函數(shù),怎么區(qū)分是誰(shuí)調(diào)用的呢?
用this指針解決這個(gè)問(wèn)題
this指針指向被調(diào)用的成員函數(shù)所屬的對(duì)象
簡(jiǎn)單來(lái)說(shuō),誰(shuí)調(diào)用這個(gè)函數(shù),this指針就指向誰(shuí)。
1.this指針是隱含每一個(gè)非靜態(tài)成員函數(shù)內(nèi)的一種指針。
2.this指針不需要定義,直接使用即可。
1、解決名稱沖突:
現(xiàn)在讓我們看一下名稱沖突問(wèn)題:
結(jié)果為0,如果你用的編譯器是vs,結(jié)果應(yīng)該是亂碼,我用的是Dev-C++。
編譯器會(huì)認(rèn)為這3個(gè)age是同一個(gè)age,跟你這個(gè)屬性age不是一回事,所以我們從來(lái)沒(méi)有給這個(gè)屬性age進(jìn)行賦值操作。
解決方法:
1.成員屬性和我們傳入的形參名稱不要同名。
2.使用this指針。
如何使用this指針呢?
代碼如下:
此時(shí)編譯器就這樣認(rèn)為了,所以就解決了這個(gè)問(wèn)題。
2、返回對(duì)象本身用*this
首先先看這樣一段代碼:
我們的目的是讓p2加3次p1的年齡,想要的p2年齡返回結(jié)果為40,可編譯器報(bào)錯(cuò),這是為什么呢?
因?yàn)槲覀兊谝淮握{(diào)用PersonADDAge這個(gè)函數(shù)后,返回的是void,所以就不能再調(diào)用這個(gè)PersonADDAge函數(shù)了,那如果我們可以讓第一次調(diào)用這個(gè)函數(shù)后的返回值仍然是p2,那就可以再次調(diào)用這個(gè)函數(shù),那我們要如何實(shí)現(xiàn)呢?
使用this指針。
代碼如下:
#include <iostream> using namespace std;class Person {public:Person(int age) {this->age = age;}int age;//如果要返回本體,要用引用的方式返回。Person &PersonADDAge(Person &p) {this->age += p.age;//this指向p2的指針,而*this指向的就是p2這個(gè)對(duì)象本體。return *this;}};//1.解決名稱沖突//void test01() { // Person p1(18); // cout << "p1的年齡為:" << p1.age << endl; // //} //2.返回對(duì)象本身用*thisvoid test02() {Person p1(10);Person p2(10);//鏈?zhǔn)骄幊趟枷?/span>p2.PersonADDAge(p1).PersonADDAge(p1).PersonADDAge(p1);cout << "p2的年齡為:" << p2.age << endl;}int main() { // test01();test02();return 0; }此時(shí)的結(jié)果就是40了。
那為什么要用引用呢?
引用指向本身內(nèi)存,不用引用就是拷貝了,而拷貝指向另一個(gè)內(nèi)存。
這里返回的不是指針或者引用,因?yàn)榍懊婕恿?#xff0c;所以返回的是p2本體。*
這個(gè)時(shí)候我們把這個(gè)引用刪除,看看結(jié)果又是多少?
結(jié)果為:20
為什么呢?
因?yàn)榇藭r(shí)返回的是一個(gè)拷貝的數(shù)據(jù),每一次返回都是一個(gè)新的對(duì)象。
所以最后就第一次調(diào)用對(duì)真正的p2產(chǎn)生影響,所以結(jié)果為20
總結(jié)
以上是生活随笔為你收集整理的C++this指针的用途的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 站长统计怎么解决(站长统计怎么弄)
- 下一篇: C++继承的继承方式