關(guān)于視頻中的幾個疑問
關(guān)于視頻中的疑問 1.Array Array::printInfo() ? //返回值為對象 ?return *this ? ? ? //this為指針,*this為對象 (1.)為什么主函數(shù)中還能訪問printInfo()函數(shù)?// ? arr1.printInfo(); (2.)arr1.printInfo().setlen(5)是否是調(diào)用同一對象的兩個成員函數(shù)? ? //應(yīng)該怎樣理解? 2.Array& Array::printInfo() ? //取得是對象Array對象中的函數(shù)printInfo()的地址嗎?應(yīng)該怎樣理解?
2016-01-07
1、Array arr1 當(dāng)實(shí)例化一個arr1的時候,因?yàn)橛蠥rray Array::printInfo()存在,系統(tǒng)會創(chuàng)建一個Array類的隱形變量,我們姑且用arr2來表示隱形變量,這時arr1和arr2指向的是不同的地址,有點(diǎn)類似于windows的復(fù)制操作。 系統(tǒng)執(zhí)行arr1.printInfo( return * this)的時候,其實(shí)相當(dāng)于arr1.printInfo( &arr2=*this; return arr2; ),所以arr1.printInfo().setlen(5)就是arr2.setlen(5).因?yàn)閍rr1和arr2指向兩個不同的地址,所以是兩個對象,所以?arr1.printInfo().setlen(5)是arr2的成員函數(shù)。
2、Array arr1 當(dāng)實(shí)例化一個arr1的時候,因?yàn)橛蠥rray& Array::printInfo()存在 ,系統(tǒng)這時候還會創(chuàng)建一個arr2出來,但是因?yàn)橛?amp;也就是引用,所以arr2和arr1指向的是同一個地址,這就有點(diǎn)類似于windows的快捷方式。系統(tǒng)執(zhí)行arr1.printInfo( return * this)的時候其實(shí)返回的還是arr2,只是arr2和arr1指向同樣的地址,所以arr1.printInfo().setlen(5)相當(dāng)于arr2.setlen(5)也相當(dāng)于arr1.setlen(5)。
給個好評吧!賺3分好不容易!
2016-01-07
首先實(shí)例化了arr1這個對象,當(dāng)然能訪問;返回的是*this這個對象,由內(nèi)存地址一樣可以知道這是同一個對象,所以是調(diào)用同一個對象的兩個成員函數(shù);這個是引用,你看看前面關(guān)于引用的講解(個人拙見,如有誤請大家指正,相互學(xué)習(xí))
2016-01-07
因?yàn)閜rintInfo函數(shù)是public的,所以可以在類外被訪問。
在聲明時,類型名后面的&代表其是引用類型。 那么?Array& Array::printInfo() 函數(shù)返回類型是“Array引用”。
而實(shí)際代碼中 return *this; 語句返回的就是將這個類實(shí)例自身。
所以?arr1.printInfo().setlen 這句代碼,在printInfo函數(shù)調(diào)用后,這里返回的還是arr1自己,所以后面setlen函數(shù)就是調(diào)用arr1自己的那個。
也正是因?yàn)樾枰B續(xù)調(diào)用setlen來對自己進(jìn)行設(shè)置,所以printInfo函數(shù)才必須要返回引用類型。如果printInfo的返回類型是普通Array,那么在調(diào)用printInfo過后得到的是個臨時構(gòu)造的Array對象,再調(diào)用setlen修改的是這個臨時對象中的值,不會改變arr1本身。