c++引用可以讓你給乙個已有的變數取乙個別名, 你可以用它對這個變數中的記憶體資訊進行讀取和修改。 這可能聽起來不是那麼有吸引力, 這意味著當你宣告乙個引用並為它分配乙個變數, 你就可以在不同作用域通過引用的宣告操作改變被引用變數的值。如果你讓你的函式引數引用 你可以通過這個函式的方法去改變源記憶體中的資訊。這十分不同於你用函式引數傳遞使其產生乙個用來拷貝的新變數。你還可以通過引用來減少函式在幕後發生的拷貝。
基礎語法
宣告乙個引用為int
型變數:
int& foo = ....;
這裡的「....」就是就是你要告訴編譯器你要引用的變數, foo
即為他的別名, 當你建立它,你必須初始化使另乙個變數的位址在幕後讓你你使用它來修改這個變數。
通過這樣的方法有點像你用乙個指標指向乙個變數來操作指標指向的記憶體。
int x;
int& foo = x;
// foo作為引用將
x的值改為56
foo = 56;
std::cout << x 《函式引數作引用
這是乙個簡單將函式引數作引用交換兩數值的例子:
void swap (int& first, int& second)
int a = 2;
int b = 3;
swap( a, b );
交換後a = 3,b = 2.事實上引用可能導致一些混亂,因為傳進去的引數可能被改變而在僅僅在被呼叫函式程式段中不是那麼顯而易見, 而指標則可清楚地表達傳進去了記憶體可能會被改變的意思。
引用提高執行效率
你可能會想你從來沒想過通過引用來改變值哪點好。 其實引用就是意味著你可以不必去增加拷貝, 不必做過多的處理。當你使用類做函式引數時, 用引用可以幫你節省很大的開銷, 基本上類作引數時要通過引用, 注意通常要加乙個const。
例子:int workwithclass( const myclass& a_class_object )
建立乙個常量引用時為了防止類中變數被修改。 這樣你就可以隨時改變乙個很大的物件方法。避免用指標傳遞大的物件, 用引用可以讓你的**更簡潔, 增加可讀性。
引用的安全問題
為了使**目的看起來更加明確, 在乙個大或小的例項中觀察無效引用。
首先, 你引用你定義的乙個空指標,你的引用將是無效的:
int *x = 0;
int& y = *x;
如果你現在去用這個引用,就會因為訪問無效記憶體而出錯。 這樣子做實際上沒有訪問到*x中儲存的值。
另乙個重大的問題就是可能引用到一塊曾經有效單後面釋放後的失效記憶體:
int& getlocalvariable()
這裡在棧中建立了乙個引用函式, 將x返回給他,使他的值改變, 但是函式由於存放在棧中會釋放掉, 這塊記憶體將不在再有效。
引用與動態分配記憶體
最後, 要注意對動態記憶體的引用, 第乙個問題就是當你引用動態記憶體時, 不清楚這塊記憶體是否被釋放了, 不過通常是不需要知道的。 這樣的好處是當你向乙個函式傳資料時你不需要對再去擔心記憶體的釋放。(反正只要不是太多浪費)
另一方面, 如果你返回乙個引用去申請一塊動態記憶體, 如果不清楚記憶體是否需要被呼叫函式清理, 那你就是自找麻煩。
C 中引用與指標的區別 詳細介紹
c 中的引用與指標的區別 指向不同型別的指標的區別在於指標型別可以知道編譯器解釋某個特定位址 指標指向的位址 中的記憶體內容及大小,而void 指標則只表示乙個記憶體位址,編譯器不能通過該指標所指向物件的型別和大小,因此想要通過void 指標操作物件必須進行型別轉化。相同點 1.都是位址的概念 指標...
C及C 中typedef的簡單使用介紹
typedef 宣告程式設計客棧,簡稱 typedef,為現有型別建立乙個新的名字。比如人們常常使用 typedef 來編寫更美觀和可讀的 所謂美觀,意指 typedef 能隱藏笨拙的語法構造以及平台相關的資料型別,從而增強可移植性和以及未來的可維護性。在程式設計中使用typedef目的一般有兩個,...
引用型別的使用注意
引用型別由型別識別符號和乙個取位址操作符來定義,引用必須被初始化.請看下面的初始化 double dval 3.14159 extern int f int ir1 1024 error int ir2 dval error int ir3 f error 上面的三個引用初始化都將導致編譯出錯.下面...