關於引用的若干事

2021-10-17 14:25:02 字數 1465 閱讀 3685

對於引用最基本的解釋就是:給乙個變數起乙個別名。也就是說兩個變數名都指向同一塊記憶體。宣告變數需要注意的是:

宣告時必須初始化

一旦初始化後,便不可更改

c++語法定義引用宣告必須初始化,沒有初始化的引用等同於野指標,是有危害性的。c++對野指標沒有硬性規定但是對引用初始化有硬性規定。引用初始化後便不能改變它那個變數,也就是說乙個引用只能指向乙個變數,這等同於乙個指標常量(指標本身不可以修改,可以通過指標修改它指向的值)。

引用的基本語法決定了引用的本質實際上是乙個指標常量

int b=1;

int &a=b;

以上語句等同於

int b=1;

int * const a=&b;

在呼叫的時候,引用可以直接修改,指標需要解引用。

引用同指標一樣,誕生的意義就是作為函式引數來傳遞。由於引用更加簡單,有些時候使用引用而不使用指標會使程式更加的簡單易懂。

int swap(int &a,int &b)

int main()

初學者可能對引用能夠改變實參的值比較迷惑,引用是變數的別名,使用別名和原來的名字有什麼區別呢?實際上函式在傳參的時完成了乙個賦值的過程。也就是將實參的值賦給了形參,這樣以上**的引數傳遞時有如下語句實現

int &a=a;   //這裡的a,b代表形參和實參

int &b=b;

這樣就很容易解釋函式的傳值呼叫不能改變實參的值和傳引用呼叫能夠改變實參的值。

另外需要額外注意的點就是不要把區域性引用作為函式的返回值,這麼做的後果和將區域性變數的指標作為返回值的後果是一樣的。這點不懂的同學可以了解一下有關棧的知識。

注意:沒有引用常量,因為引用本身就是常量(一經初始化,便不能更改)

常量引用描述的是不能通過這個引用修改它指向的值,常量引用的語法也十分簡單,在引用的宣告前加乙個const就可以了。常量引用的一般使用場景就是我們需要作為函式引數傳遞乙個值,但是我們又不想修改它,這時候我們就可以用常量引用作為形參來接受這個值。這時候初學者或許會有疑問,既然我們只想讀這個變數而不是寫,那麼我們為何不直接傳值呢?實際上這兩種方法多可以達到傳引數而不改變原值的目的,判斷這兩種方法孰優孰劣的條件就是二者誰的空間開銷大,由於引用的本質是指標,所以我們在傳遞常量引用的時候傳遞的是指標,我們知道指標的占用的記憶體空間是8個位元組,所以當我們傳遞的是char或者是int型別的值得時候,直接傳值能節省空間的,但是當我們要傳物件,結構體或者是容器的時候,最好是傳遞常量引用。

假如我們都傳常量引用,那麼相比較於傳值,我們最多浪費7個位元組(位址8位元組減去char型別乙個位元組)。但是假如我們都使用傳值,當我們遇到很大的結構體或者容器的時候,我們浪費的位元組是將遠遠大於7。所以如果你嫌麻煩,在傳遞任何不想被修改的值的時候,可以都使用傳常量引用。實際上這也是c++所提倡的。

PyQt5練手若干事項

第一部分 程式設計環境搭配 1.anaconda3 4.2.0 windows x86.exe,先安裝這個,在c anaconda3 2.pyqt5 5.6 gpl py3.5 qt5.6.0 x32 2.exe,再安裝這個,會自動在找到目錄c anaconda3,使用 import pyqt5 驗...

關於tableViewCell 的重用若干問題

tableviewcell 重用機制 為每個cell指定乙個重用識別符號 reuseidentifier 當cell滾出螢幕時,會將滾出螢幕的單元格放入重用的佇列中,當某個未在螢幕上的單元格要顯示的時候,就從這個佇列中取出單元格進行重用。對於系統的tableviewcell我們一般採用如下幾種方式解...

關於字典的若干應用

1.將兩個陣列合併成乙個字典 f1 dict zip date,empty id 2.排序字典按鍵值排序 f2 sorted f1.items key lambda k k 0 3.取出字典中所有值並組成乙個陣列 從排序後的字典中取 res8 value for key,value in f2 鏈結...