您好,登錄后才能下訂單哦!
這篇文章主要講解了“C++中的this指針的功能”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++中的this指針的功能”吧!
this指針是一個特殊的指針,當類的某個非靜態的成員函數在執行時,就會存在this指針。它指向類的一個對象,且這個對象的某個成員函數正在被調用。
this指針的名字始終是this,而且總是作為隱含參數傳遞給每一個被聲明的成員函數,例如:
void Date::myFunc(Date* this);
實際編程時函數的聲明不需要包含這個參數。
當程序中調用某個對象的成員函數時,編譯器會把該對象的地址加入到參數列表中,感覺上就好象函數采用了上面所示的聲明,并且是用如下方式來調用的:
dt.myFunc(& dt);
靜態成員函數不存在this指針。
當調用某個對象的成員函數時,編譯器把對象的地址傳遞給this指針,然后再調用該函數。因此,成員函數你對任何成員的調用實際上都隱式地使用了this指針。
1.以this指針作為返回值
使this指針可以允許成員函數返回調用對象給調用者。前面的程序中重載賦值運算符沒有返回值,因此不能用如下的形式對字符串進行賦值:
a=b=c;
為了使重載的類賦值機制也能這樣方便,必須讓賦值函數返回賦值的結果,在這里就是目標對象。當賦值函數執行時,其返回值也恰好是this指針所指的內容。下面的程序對前面那個程序進行了修改,讓重載賦值運算符返回了一個Date對象的引用。
#include \"iostream.h\" #include \"string.h\" class Date { int mo,da,yr; char *month; public: Date(int m=0, int d=0, int y=0); ~Date(); void operator=(const Date&); void display() const; }; Date::Date(int m, int d, int y) { static char *mos[] = { \"January\",\"February\",\"March\",\"April\",\"May\",\"June\", \"July\",\"August\",\"September\",\"October\",\"November\",\"December\" }; mo = m; da = d; yr = y; if (m != 0) { month = new char[strlen(mos[m-1])+1]; strcpy(month, mos[m-1]); } else month = 0; } Date::~Date() { delete [] month; } void Date::display() const { if (month!=0) cout<<month<<\' \'<<da<<\",\"<<yr<<endl; } void Date::operator=(const Date& dt) { if (this != &dt) { mo = dt.mo; da = dt.da; yr = dt.yr; delete [] month; if (dt.month != 0) { month = new char [std::strlen(dt.month)+1]; std::strcpy(month, dt.month); } else month = 0; } return *this; } int main() { Date birthday(8,11,1979); Date oldday,newday; oldday=newday=birthday; birthday.display(); oldday.display(); newday.display(); return 0; }
2.在鏈表中使用this指針
在應用程序中,如果數據結構里有指向自身類型的成員,那么使用this指針會提供更多的方便。下面的程序中建立了一個類ListEntry的鏈表。
#include \"iostream.h\" #include \"string.h\" class ListEntry { char* listvalue; ListEntry* preventry; public: ListEntry(char*); ~ListEntry() { delete [] listvalue; } ListEntry* PrevEntry() const { return preventry; }; void display() const { cout<<endl<<listvalue; } void AddEntry(ListEntry& le) { le.preventry = this; } }; ListEntry::ListEntry(char* s) { listvalue = new char[strlen(s)+1]; strcpy(listvalue, s); preventry = 0; } int main() { ListEntry* prev = 0; while (1) { cout <<endl<<\"Enter a name(\'end\' when done): \"; char name[25]; cin >> name; if (strncmp(name, \"end\", 3) == 0) break; ListEntry* list = new ListEntry(name); if (prev != 0) prev->AddEntry(*list); prev = list; } while (prev != 0) { prev->display(); ListEntry* hold = prev; prev = prev->PrevEntry(); delete hold; } return 0; }
程序運行時,會提示輸入一串姓名,當輸入完畢后,鍵入\"end\",然后程序會逆序顯示剛才輸入的所有姓名。
程中ListEntry類含有一個字符串和一個指向前一個表項的指針。構造函數從對中獲取內存分配給字符串,并把字符串的內容拷貝到內存,然后置鏈接指針為NULL。析構函數將釋放字符串所占用的內存。
成員函數PrevEntry()返回指向鏈表前一個表項的指針。另一個成員函數顯示當前的表項內容。
成員函數AddEntry(),它把this指針拷貝給參數的preventry指針,即把當前表項的地址賦值給下一個表項的鏈接指針,從而構造了一個鏈表。它并沒有改變調用它的listEntry對象的內容,只是把該對象的地址賦給函數的參數所引用的那個ListEntry對象的preventry指針,盡管該函數不會修改對象的數據,但它并不是常量型。這是因為,它拷貝對象的地址this指針的內容給一個非長常量對象,而編譯器回認為這個非常量對象就有可能通過拷貝得到的地址去修改當前對象的數據,因此AddEntry()函數在聲明時不需要用const。
感謝各位的閱讀,以上就是“C++中的this指針的功能”的內容了,經過本文的學習后,相信大家對C++中的this指針的功能這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。