日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

一起來學習C++中類的this指針以使用_C 語言

作者:∞大明白 ? 更新時間: 2022-05-02 編程語言

c++的類中,非靜態的成員函數都有一個隱藏的this指針,在函數體中所以的成員變量都是通過this指針來訪問的。但是this指針是對用戶是透明的,用戶不需要顯示的給this指針傳參,編譯時會自動接收參數。

,this指針的注意點

  • 調用成員函數時,不可以顯示給this指針傳參
  • 定義成員函數時,不能顯示的聲明this指針
  • 在成員函數內部,可以顯示的使用this指針

用一個日期類,來講述this指針的注意點:

class Date
{
 public:
 void Print()
 {
  cout<<_year<<"/"<<_month<<"/"<<_day<

以上就是一個日期類了,在類里面我定義了一個成員函數Print,這里要講一下,在類中定義一個成員函數可能會被看成內聯函數,想這么簡單一個Print?函數一般是會別看成內聯函數的。

其實這個成員函數還可以寫成這樣:

void Print()
{
 cout<_year<<"/"<_month<<"/"<day<

這樣寫有點畫蛇添足的感覺,但是方便大家看,在成員函數中每個成員變量的訪問都里離不開this指針。這個this指針隱藏在函數形參的頭一位,也就是Print(Date * this)。

比如我要調用這個成員函數:

int main()
{
 Date s1(2022,2,28);
 Date s2(2022,3,1);
 s1.Print();
 s2.Print();
}

運行結果如下:

在這里插入圖片描述

可以看到,調用結果是符合預期的,Print函數中是利用this指針來區分對象的。

錯誤用例:

(1)

int main()
{
 Date s1(2022,2,28);
 s1.Print(&s1);
}

不可以顯示的給this指針傳參,雖然我們知道this指針存在,但是我們不可以給this指針傳參,就當潛規則吧。

(2)

void Date::Print(Date* this);

成員函數的聲明以及定義都不能有this指針,這樣做不行的,可以想想設計者的初心,他是嫌棄老是傳地址麻煩,所以搞了一個隱藏的this指針,你再給函數傳參或者定義函數時給this指針,不是多此一舉嘛。

二,this指針存在哪里

this指針是成員函數第一個隱藏的指針形參,一般存在棧中。但是也是由編譯器決定的,有的就存在寄存器中。

三,this指針的面試坑題

class A
{ 
public:
 void PrintA() 
 {
 cout<<_a<PrintA(); 
 p->Show();
 }

問:以上程序可以運行嘛?會崩潰嘛?崩潰在哪里?

在這里插入圖片描述

這是對空指針解引用導致的內存問題,所以程序崩潰了,this指針可以為空,但是不能對空指針解引用,函數PrintA中,cout<<_a<;可以寫成cout<< this -> _a<; 講到這大家應該懂了。

還有一點那么Show函數有問題嘛?沒問題,因為不存在對this的解引用。

我們將PrintA函數屏蔽掉,看運行結果:

在這里插入圖片描述

總結

原文鏈接:https://blog.csdn.net/lyzzs222/article/details/123189470

欄目分類
最近更新