C++ 对引用的理解2
1.指針就是數(shù)據(jù)或代碼在內(nèi)存中的地址,指針變量指向的就是內(nèi)存中的數(shù)據(jù)或代碼。這里有一個(gè)關(guān)鍵詞需要強(qiáng)調(diào),就是內(nèi)存,指針只能指向內(nèi)存,不能指向寄存器或者硬盤,因?yàn)榧拇嫫骱陀脖P沒(méi)法尋址。
2.其實(shí) C++ 代碼中的大部分內(nèi)容都是放在內(nèi)存中的,例如定義的變量、創(chuàng)建的對(duì)象、字符串常量、函數(shù)形參、函數(shù)體本身、new或malloc()分配的內(nèi)存等,這些內(nèi)容都可以用&來(lái)獲取地址,進(jìn)而用指針指向它們。除此之外,還有一些我們平時(shí)不太留意的臨時(shí)數(shù)據(jù),例如表達(dá)式的結(jié)果、函數(shù)的返回值等,它們可能會(huì)放在內(nèi)存中,也可能會(huì)放在寄存器中。一旦它們被放到了寄存器中,就沒(méi)法用&獲取它們的地址了,也就沒(méi)法用指針指向它們了。
3.寄存器離 CPU 近,并且速度比內(nèi)存快,將臨時(shí)數(shù)據(jù)放到寄存器是為了加快程序運(yùn)行。但是寄存器的數(shù)量是非常有限的,容納不下較大的數(shù)據(jù),所以只能將較小的臨時(shí)數(shù)據(jù)放在寄存器中。int、double、bool、char 等基本類型的數(shù)據(jù)往往不超過(guò) 8 個(gè)字節(jié),用一兩個(gè)寄存器就能存儲(chǔ),所以這些類型的臨時(shí)數(shù)據(jù)通常會(huì)放到寄存器中;而對(duì)象、結(jié)構(gòu)體變量是自定義類型的數(shù)據(jù),大小不可預(yù)測(cè),所以這些類型的臨時(shí)數(shù)據(jù)通常會(huì)放到內(nèi)存中。
4.常量表達(dá)式由于不包含變量,沒(méi)有不穩(wěn)定因素,所以在編譯階段就能求值。編譯器不會(huì)分配單獨(dú)的內(nèi)存來(lái)存儲(chǔ)常量表達(dá)式的值,而是將常量表達(dá)式的值和代碼合并到一起,放到虛擬地址空間中的代碼區(qū)。從匯編的角度看,常量表達(dá)式的值就是一個(gè)立即數(shù),會(huì)被“硬編碼”到指令中,不能尋址。
5.引用和指針在本質(zhì)上是一樣的,引用僅僅是對(duì)指針進(jìn)行了簡(jiǎn)單的封裝。引用和指針都不能綁定到無(wú)法尋址的臨時(shí)數(shù)據(jù),并且 C++ 對(duì)引用的要求更加嚴(yán)格,在某些編譯器下甚至連放在內(nèi)存中的臨時(shí)數(shù)據(jù)都不能指代。
著重看下這里
6. 引用 與 const組合在一起,類似 const int &r1,就變成了常引用
將常引用綁定到臨時(shí)數(shù)據(jù)時(shí),編譯器采取了一種妥協(xié)機(jī)制:編譯器會(huì)為臨時(shí)數(shù)據(jù)創(chuàng)建一個(gè)新的、無(wú)名的臨時(shí)變量,并將臨時(shí)數(shù)據(jù)放入該臨時(shí)變量中,然后再將引用綁定到該臨時(shí)變量。注意,臨時(shí)變量也是變量,所有的變量都會(huì)被分配內(nèi)存。
7.編譯器禁止指針指向不同類型的數(shù)據(jù)
引用(Reference)和指針(Pointer)在本質(zhì)上是一樣的,引用僅僅是對(duì)指針進(jìn)行了簡(jiǎn)單的封裝,「類型嚴(yán)格一致」這條規(guī)則同樣也適用于引用。
7. const 引用與類型轉(zhuǎn)換
當(dāng)對(duì)引用添加 const 限定后,情況就又發(fā)生了變化,編譯器允許引用綁定到類型不一致的數(shù)據(jù),當(dāng)引用的類型和數(shù)據(jù)的類型不一致時(shí),如果它們的類型是相近的,并且遵守「數(shù)據(jù)類型的自動(dòng)轉(zhuǎn)換」規(guī)則,那么編譯器就會(huì)創(chuàng)建一個(gè)臨時(shí)變量,并將數(shù)據(jù)賦值給這個(gè)臨時(shí)變量(這時(shí)候會(huì)發(fā)生自動(dòng)類型轉(zhuǎn)換),然后再將引用綁定到這個(gè)臨時(shí)的變量,這與「將 const 引用綁定到臨時(shí)數(shù)據(jù)時(shí)」采用的方案是一樣的。
8.
給引用添加 const 限定后,不但可以將引用綁定到臨時(shí)數(shù)據(jù),還可以將引用綁定到類型相近的數(shù)據(jù),這使得引用更加靈活和通用,它們背后的機(jī)制都是臨時(shí)變量。
引用類型的函數(shù)形參請(qǐng)盡可能的使用 const
使用 const 可以避免無(wú)意中修改數(shù)據(jù)的編程錯(cuò)誤;
使用 const 能讓函數(shù)接收 const 和非 const 類型的實(shí)參,否則將只能接收非 const 類型的實(shí)參;
使用 const 引用能夠讓函數(shù)正確生成并使用臨時(shí)變量。
總結(jié)
以上是生活随笔為你收集整理的C++ 对引用的理解2的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 创世神话用什么来传送?
- 下一篇: 使用 C++的第三方库 jsoncpp的