天天看點

【C++】This指針和複制構造函數this指針複制構造函數源代碼下載下傳位址:

在聲明一個類的時候,是沒有配置設定存儲空間的,隻有在真正定義一個對象的時候,程式才會為這個對象配置設定相應的存儲空間。

如果定義了多個對象,這些對象都有自己的存儲空間,但是這些對象都是用相同的成員方法的。

當不同的對象調用成員方法時,怎麼保證就是這個對象的成員?

在每個成員函數中,都包含一個特殊的指針。

這個指針的名字是固定的,就是this指針。

this指針是指向類對象的指針,它的值是目前被調用的所在對象的位址!

this指針是指向本類對象的指針,它作為參數傳遞給成員函數

this指針是隐式使用的。由編譯器自動實作,我們不必人為的在形參中添加this指針。

因為this表示這個對象的指針,是以*this就表示這個對象了

(*this).調用成員變量/函數和this->調用成員變量/函數,是一樣的效果!

注意給*this添加括号,因為.運算符的優先級比較高

複制構造函數和普通構造函數有一些相似處的,也沒有傳回值,類名作為函數名!

複制構造函數一種特殊的構造函數,在建立一個新的對象時将其他對象作為參數時,

編譯器将會調用複制構造函數。不提供時使用預設構造函數。預設構造函數内部各個成員變量指派。

建立之後,新對象是老對象的副本,二者值相同。但具有不同的存儲空間。

在什麼情況下使用複制構造函數

比如:建立一個新的對象的時候,把原來的一個對象作為參數傳遞給新的對象作為構造函數

(注意,構造函數實作的時候,需要在其他函數前面先實作)

複制構造函數也是構造函數的一種!

上面就是複制構造函數使用的三種情形!

如果我們把複制構造函數 CTime::CTime(CTime& time)修改為CTime::CTime(CTime time)

CTime& time是一個引用類型的參數,現在将引用去掉的話,就滿足了調用複制構造函數中的一種,以類對象(傳值)作為函數參數時,

這樣在使用的時候,就會造成死循環!

是以注意複制構造函數是傳引用來實作的!

我們使用類對象作為函數參數的時候,以及傳回一個對象的時候,代價是很大的,

因為伴随着對象的建立和銷毀,還伴随着複制構造函數的調用, 是以一般使用傳引用來規避這種代價!

引用傳遞:

形參相當于是實參的“别名”,對形參的操作其實就是對實參的操作,在引用傳遞過程中,被調函數的形式參數雖然也作為局部變量在棧中開辟了記憶體空間,但是這時存放的是由主調函數放進來的實參變量的位址。被調函數對形參的任何操作都被處理成間接尋址,即通過棧中存放的位址通路主調函數中的實參變量。正因為如此,被調函數對形參做的任何操作都影響了主調函數中的實參變量。

歡迎轉載,分享是進步的源泉。

繼續閱讀