成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++基礎(chǔ)之this指針的詳解

開發(fā) 后端
本文介紹的是C++中的this指針,希望對(duì)你有幫助,一起來(lái)看。

關(guān)于C++中的this指針,建議大家看看這篇文章,《C++中的this指針》,供參考。

this指針是一個(gè)特殊的指針,當(dāng)類的某個(gè)非靜態(tài)的成員函數(shù)在執(zhí)行時(shí),就會(huì)存在this指針。它指向類的一個(gè)對(duì)象,且這個(gè)對(duì)象的某個(gè)成員函數(shù)正在被調(diào)用。
this指針的名字始終是this,而且總是作為隱含參數(shù)傳遞給每一個(gè)被聲明的成員函數(shù),例如:

  1. void Date::myFunc(Date* this); 

實(shí)際編程時(shí)函數(shù)的聲明不需要包含這個(gè)參數(shù)。

當(dāng)程序中調(diào)用某個(gè)對(duì)象的成員函數(shù)時(shí),編譯器會(huì)把該對(duì)象的地址加入到參數(shù)列表中,感覺上就好象函數(shù)采用了上面所示的聲明,并且是用如下方式來(lái)調(diào)用的:

  1. dt.myFunc(& dt); 

靜態(tài)成員函數(shù)不存在this指針。

當(dāng)調(diào)用某個(gè)對(duì)象的成員函數(shù)時(shí),編譯器把對(duì)象的地址傳遞給this指針,然后再調(diào)用該函數(shù)。因此,成員函數(shù)你對(duì)任何成員的調(diào)用實(shí)際上都隱式地使用了this指針。

1.以this指針作為返回值

使this指針可以允許成員函數(shù)返回調(diào)用對(duì)象給調(diào)用者。前面的程序中重載賦值運(yùn)算符沒有返回值,因此不能用如下的形式對(duì)字符串進(jìn)行賦值:

  1. a=b=c; 

為了使重載的類賦值機(jī)制也能這樣方便,必須讓賦值函數(shù)返回賦值的結(jié)果,在這里就是目標(biāo)對(duì)象。當(dāng)賦值函數(shù)執(zhí)行時(shí),其返回值也恰好是this指針?biāo)傅膬?nèi)容。下面的程序?qū)η懊婺莻€(gè)程序進(jìn)行了修改,讓重載賦值運(yùn)算符返回了一個(gè)Date對(duì)象的引用。

 

  1. #include \"iostream.h\"  
  2. #include \"string.h\"  
  3. class Date  
  4. {  
  5. int mo,da,yr;  
  6. char *month;  
  7. public:  
  8. Date(int m=0, int d=0, int y=0);  
  9. ~Date();  
  10. void operator=(const Date&);  
  11. void display() const;  
  12. };  
  13. Date::Date(int m, int d, int y)  
  14. {  
  15. static char *mos[] =  
  16. {  
  17. \"January\",\"February\",\"March\",\"April\",\"May\",\"June\",  
  18. \"July\",\"August\",\"September\",\"October\",\"November\",\"December\" 
  19. };  
  20. mo = m; da = d; yr = y;  
  21. if (m != 0)  
  22. {  
  23. month = new char[strlen(mos[m-1])+1];  
  24. strcpy(month, mos[m-1]);  
  25. }  
  26. else month = 0;  
  27. }   
  28. Date::~Date()  
  29. {  
  30. delete [] month;  
  31. }  
  32.  
  33. void Date::display() const 
  34. {  
  35. if (month!=0) cout<<month<<\' \'<<da<<\",\"<<yr<<endl;  
  36. }  
  37.  
  38. void Date::operator=(const Date& dt)  
  39. {  
  40. if (this != &dt)  
  41. {  
  42. mo = dt.mo;  
  43. da = dt.da;  
  44. yr = dt.yr;  
  45. delete [] month;  
  46. if (dt.month != 0)  
  47. {  
  48. month = new char [std::strlen(dt.month)+1];  
  49. std::strcpy(month, dt.month);  
  50. }  
  51. else month = 0;  
  52. }  
  53. return *this;  
  54. }  
  55. int main()  
  56. {  
  57. Date birthday(8,11,1979);  
  58. Date oldday,newday;  
  59. oldday=newday=birthday;  
  60. birthday.display();  
  61. oldday.display();  
  62. newday.display();  
  63. return 0;  

2.在鏈表中使用this指針

在應(yīng)用程序中,如果數(shù)據(jù)結(jié)構(gòu)里有指向自身類型的成員,那么使用this指針會(huì)提供更多的方便。下面的程序中建立了一個(gè)類ListEntry的鏈表。

  1. #include \"iostream.h\"  
  2. #include \"string.h\"  
  3.  
  4. class ListEntry  
  5. {  
  6. char* listvalue;  
  7. ListEntry* preventry;  
  8. public:  
  9. ListEntry(char*);  
  10. ~ListEntry() { delete [] listvalue; }  
  11. ListEntry* PrevEntry() const { return preventry; };  
  12. void display() const { cout<<endl<<listvalue; }  
  13. void AddEntry(ListEntry& le) { le.preventry = this; }  
  14. };  
  15.  
  16. ListEntry::ListEntry(char* s)  
  17. {  
  18. listvalue = new char[strlen(s)+1];  
  19. strcpy(listvalue, s);  
  20. preventry = 0;  
  21. }  
  22.  
  23. int main()  
  24. {  
  25. ListEntry* prev = 0;  
  26.  
  27. while (1)  
  28. {  
  29. cout <<endl<<\"Enter a name(\'end\' when done): \";  
  30. char name[25];  
  31. cin >> name;  
  32. if (strncmp(name, \"end\", 3) == 0) break;  
  33. ListEntry* list = new ListEntry(name);   
  34. if (prev != 0) prev->AddEntry(*list);  
  35. prev = list;  
  36. }  
  37.  
  38. while (prev != 0)  
  39. {  
  40. prev->display();  
  41. ListEntry* hold = prev;  
  42. prev = prev->PrevEntry();  
  43. delete hold;  
  44. }  
  45. return 0;  

程序運(yùn)行時(shí),會(huì)提示輸入一串姓名,當(dāng)輸入完畢后,鍵入\"end\",然后程序會(huì)逆序顯示剛才輸入的所有姓名。

程中ListEntry類含有一個(gè)字符串和一個(gè)指向前一個(gè)表項(xiàng)的指針。構(gòu)造函數(shù)從對(duì)中獲取內(nèi)存分配給字符串,并把字符串的內(nèi)容拷貝到內(nèi)存,然后置鏈接指針為NULL。析構(gòu)函數(shù)將釋放字符串所占用的內(nèi)存。

成員函數(shù)PrevEntry()返回指向鏈表前一個(gè)表項(xiàng)的指針。另一個(gè)成員函數(shù)顯示當(dāng)前的表項(xiàng)內(nèi)容。

成員函數(shù)AddEntry(),它把this指針拷貝給參數(shù)的preventry指針,即把當(dāng)前表項(xiàng)的地址賦值給下一個(gè)表項(xiàng)的鏈接指針,從而構(gòu)造了一個(gè)鏈表。它并沒有改變調(diào)用它的listEntry對(duì)象的內(nèi)容,只是把該對(duì)象的地址賦給函數(shù)的參數(shù)所引用的那個(gè)ListEntry對(duì)象的preventry指針,盡管該函數(shù)不會(huì)修改對(duì)象的數(shù)據(jù),但它并不是常量型。這是因?yàn)椋截悓?duì)象的地址this指針的內(nèi)容給一個(gè)非長(zhǎng)常量對(duì)象,而編譯器回認(rèn)為這個(gè)非常量對(duì)象就有可能通過拷貝得到的地址去修改當(dāng)前對(duì)象的數(shù)據(jù),因此AddEntry()函數(shù)在聲明時(shí)不需要用const。

希望通過以上內(nèi)容的介紹,能夠給你帶來(lái)幫助。

責(zé)任編輯:于鐵 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

2021-12-21 15:31:10

C++語(yǔ)言指針

2011-07-14 17:17:21

C++指針

2011-07-14 17:02:09

C++指針

2011-07-13 16:14:53

C++引用指針

2010-01-28 13:57:19

C++指針基礎(chǔ)

2011-07-15 00:47:13

C++多態(tài)

2010-12-17 10:07:59

2010-02-01 16:13:15

C++繼承

2011-07-13 18:24:18

C++

2011-04-11 11:09:50

this指針

2011-07-14 17:45:06

CC++

2020-07-30 12:40:35

CC++編程語(yǔ)言

2016-12-05 13:35:02

C語(yǔ)言數(shù)組指針

2010-02-02 09:43:27

C++存儲(chǔ)區(qū)域

2011-07-14 23:27:05

C++引用

2014-01-24 09:49:01

C++指針

2024-05-15 16:01:04

C++編程開發(fā)

2010-01-26 13:42:28

C++指針

2010-02-05 17:00:06

C++單例模式

2011-07-15 01:29:39

C++析構(gòu)函數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品国色综合久久 | 亚洲小视频在线观看 | 久久久国产一区二区 | 久久视频一区 | 日韩在线小视频 | 日本成人中文字幕在线观看 | 激情欧美一区二区三区中文字幕 | 久久久久久亚洲国产精品 | 亚洲精品视频在线看 | 国产精品视频在线观看 | 国产精品高潮呻吟久久aⅴ码 | 日韩av一区二区在线观看 | 亚洲免费视频网址 | 亚洲人成人一区二区在线观看 | www.国产一区 | 欧美日韩国产一区二区 | 国产你懂的在线观看 | 一级大片免费 | 亚洲精品久久久久久一区二区 | 成人性视频免费网站 | 一区二区三区视频在线观看 | 99精品国产一区二区三区 | 成人免费视频网站在线看 | 欧美三级视频 | 精品国产黄a∨片高清在线 www.一级片 国产欧美日韩综合精品一区二区 | 日韩欧美三区 | 中文字幕在线免费观看 | 99精品视频在线 | 国产一级电影在线观看 | 日韩看片 | 日韩成人在线观看 | 午夜资源| 国产成人免费一区二区60岁 | 国产激情精品一区二区三区 | 日韩免费高清视频 | 免费观看成人鲁鲁鲁鲁鲁视频 | 久久在线视频 | 免费一级毛片 | 岛国午夜 | 久久久久久久久久久91 | 国产偷录叫床高潮录音 |