本周的課程涉及的知識(shí)點(diǎn)非常繁雜多變 這里我挑選出幾個(gè)我認(rèn)為值得自己以及大家注意和值得深究的地方:
【pointer - like classes】
課程中 侯捷老師運(yùn)用了 智能指針 與 迭代器 兩個(gè)經(jīng)典的例子 給我們闡釋了pointer - like class,
按我的理解 智能指針就是在class的data中包含了一個(gè)指針 并且這個(gè)指針可以指向任何想要指向的object
從而達(dá)到了指針的作用
因此 若想要達(dá)到指針的作用 就必須要重寫(xiě)操作符*與&
*注意點(diǎn):箭頭符號(hào)->的特殊行為:作用下去得到的結(jié)果噪裕,箭頭符號(hào)會(huì)繼續(xù)作用在得到的東西上
引申:侯捷老師只是粗略地介紹了定義與用法 在課程中 老師提出了一個(gè)問(wèn)題:
為何讓class像一個(gè)指針or像一個(gè)函數(shù)呢味滞?其目的何在?
這里通過(guò)查閱相關(guān)資料 我總結(jié)如下:
智能指針在面對(duì)異常的時(shí)候格外有用吃挑,因?yàn)樗麄兡軌虼_保正確的銷(xiāo)毀動(dòng)態(tài)分配的對(duì)象割岛。他們也可以用于跟蹤被多用戶(hù)共享的動(dòng)態(tài)分配對(duì)象女器。
這也就是智能指針最有用的地方 因?yàn)槿绻穷?lèi)的對(duì)象 則會(huì)自動(dòng)的調(diào)用析構(gòu)函數(shù)來(lái)用以銷(xiāo)毀對(duì)象 而不用手動(dòng)銷(xiāo)毀 確保了內(nèi)存泄漏
【 reference 】
在本周末尾 侯捷老師講解了引用& 其實(shí)reference by pointer 指的即是指針 又是引用
而引用 是一種漂亮的指針 其本質(zhì)意義上 就是指針
只不過(guò)使用引用的寫(xiě)法 相較于指針 會(huì)更加簡(jiǎn)潔 明確
引申: 那么如果指針和引用聯(lián)系在一起 又會(huì)產(chǎn)生什么結(jié)果呢?
1). ** 指針的指針
2). *&指針的引用
二者其實(shí)都是指針 指針的指針其實(shí)是一個(gè)指向了指針的指針 其中存儲(chǔ)了指向指針的地址
這里我列舉出一個(gè)我在網(wǎng)上查找到的非常簡(jiǎn)潔明了的資料圖來(lái)說(shuō)明指針的指針:
指針的引用浸遗,指針?biāo)彩且粋€(gè)變量猫胁,*&就和普通變量的引用一樣,也可以理解為指針變量的別名跛锌。
而指針的引用 相當(dāng)于傳遞了其他指針變量的地址 這樣一來(lái) 指針的數(shù)值就可以人為的發(fā)生改變 而指針本身的數(shù)值(指針本身的地址)是不允許發(fā)生改變的
例如:
fun(int * pA); // pA的數(shù)值在函數(shù)返回后不會(huì)變化
fun(int*& pA); // pA的數(shù)值在函數(shù)返回可能會(huì)發(fā)生變化弓摘,如果fun函數(shù)內(nèi)部對(duì)pA賦值的話(huà)
void InitStack(LNode* & HS)
{
HS = NULL; // 函數(shù)返回后嫉拐, HS就是NULL了
}
void InitStack(LNode* HS)
{
HS = NULL; // 函數(shù)返回后, HS依然是傳遞進(jìn)來(lái)的數(shù)值
}
*/
另外一篇文章有兩個(gè)例子 分別給了指針的指針和指針的引用:
https://www.canadapost.ca/cpotools/apps/track/personal/findByTrackNumber?trackingNumber=2006603813774502&LOCALE=en&LOCALE2=en.