<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
參照不是新定義一個變數,而是給已存在變數取了一個別名,編譯器不會為參照變數開闢記憶體空間,它和它參照的變數共用同一塊記憶體空間。
比如:李逵,在家稱為"鐵牛",江湖上人稱"黑旋風"。那麼這裡的“鐵牛”、“黑旋風”就稱李逵的參照。
在程式中呢,參照的用法如下:
型別& 參照變數名(物件名) = 參照實體;
舉個例子:
void TestRef() { int a = 10; int& ra = a;//<====定義參照型別 printf("%pn", &a); //列印出a的地址 printf("%pn", &ra); //列印出ra的地址 }
結果如下:
其中ra為a的參照,可見 a 和 ra 的地址一樣,這就說明了變數與變數的參照公用的一塊記憶體空間。
特別注意:參照型別必須和參照實體是同種型別的
1. 參照在定義時必須初始化
2. 一個變數可以有多個參照
3. 參照一旦參照一個實體,再不能參照其他實體
例如:
void TestRef() { int a = 10; // int& ra; // 該條語句編譯時會出錯,因為沒有初始化 int& ra = a; int& rra = a; printf("%p %p %pn", &a, &ra, &rra); }
知道參照的特性後,我們就可以簡化在C語言中一些簡單函數的寫法,如交換兩個數,可直接傳變數的參照為引數來實現,具體如下:
可見當傳入的引數為變數的參照時,就可以避免在次開闢記憶體空間,一定程度上提高了程式碼執行效率。
所謂常參照就是在一個變數的參照前加一個關鍵字 const 來使這個參照具有常數的性質。
如下所示:
void TestConstRef() { const int a = 10; //int& ra = a; // 該語句編譯時會出錯,因為a為常數,而ra為變數(由&前面的型別決定,為int變數型別) const int& ra = a; // int& b = 10; // 該語句編譯時會出錯,b為常數 const int& b = 10; double d = 12.34; //int& rd = d; // 該語句編譯時會出錯,型別不同 const int& rd = d; }
再例如:
int main() { int i = 10; double d = i; //double& r=i; //這裡編譯器會報錯,具體原因如下圖示 const double& r = i; //加上const 修飾就會使參照具有常性 return 0; }
所以只有在定義參照前加上const 修飾就能使之具有常性。
另外要注意使用const參照時的許可權問題,例如:
#include<iostream> using namespace std; int main() { // 使用常變數時變成常變數的別名的條件:不變或者縮小常變數的讀寫許可權是可以的, //放大你常變數讀寫許可權不行的 const int a = 10; // int& b = a; // 不能這樣定義b,這樣會使a的許可權變大,編譯器會報錯 int c = 20; const int& d = c; // 可以這樣定義,d變成的c的別名,d不能修改c,相當於把c的許可權縮小 //其中c是可以改變的,但是d只能讀不能寫 return 0; }
如上解釋一下:並不是每個別名(即參照)都跟原名字有一樣的許可權,具體要看怎麼修飾。
1、做引數
void Swap(int& left, int& right) { int temp = left; left = right; right = temp; }
這裡提一下參照做引數的優點:
1、 傳參照是為了減少傳值傳參時的拷貝
2、使用const修飾參照時可以保護形參不會被改變
3、const參照做引數時,即可接收變數,也可以接收常數
總的來說,函數傳參如果想減少拷貝就用參照傳參,如果函數中不改變這個引數最好用const 參照傳參
2、做返回值
看如下栗子:
為什麼列印出的 ret=7 呢?
這是因為函數的返回型別為 int& ,所以返回值 c 的型別就是 int&,而 ret 作為接收函數的返回值的量,也為 int& 型,所以在這裡就可以把 ret 看做是 c 的別名,當程式來到 Add(3,4); 這條語句時,返回值 c 就變為了 7,所以此時的 ret 的值也就為7。
以上也說明了使用參照做返回值會有一定的風險性。
最後來總結一下參照與指標的區別。
在語法概念上參照就是一個別名,沒有獨立空間,和其參照實體共用同一塊空間。在底層實現上實際是有空間的,因為參照是按照指標方式來實現的。
來看這樣一段程式碼:
int main() { int a = 10; int& ra = a; ra = 20; int* pa = &a; *pa = 20; return 0; }
再檢視其組合程式碼,會發現參照與指標的實現方式是一樣的。
參照與指標的不同點:
1.參照在定義時必須初始化,指標沒有要求
2. 參照在初始化時參照一個實體後,就不能再參照其他實體,而指標可以在任何時候指向任何一個同型別實體
3. 沒有NULL參照,但有NULL指標
4. 在sizeof中含義不同:參照結果為參照型別的大小,但指標始終是地址空間所佔位元組個數(32位元平臺下佔4個位元組)
5. 參照自加即參照的實體增加1,指標自加即指標向後偏移一個型別的大小
6. 有多級指標,但是沒有多級參照
7. 存取實體方式不同,指標需要顯式解除參照,參照編譯器自己處理
8. 參照比指標使用起來相對更安全(因為指標使用不慎就會造成野指標)
到此這篇關於C++中參照的相關知識點的文章就介紹到這了,更多相關C++中參照知識點內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45