引用是乙個已經存在的物件的別名。一旦乙個物件初始化了這個引用,那麼名稱和引用都能夠用來引用該物件。
int a =12
;int &ra=a
;//ra
是物件a
的乙個別名
--ra;//
此時物件
a=11
a=10
;//ra=10
int* pa=&ra
; //pa
指標指向物件
a引用經常與指標混淆,可能是c++編譯器常常將引用像指標一樣使用,但是兩者的機制是不同的。
引用和指標有3大區別:沒有null的引用、所有的引用都必須初始化、引用總是引用已經被初始化的物件。由上面的例子我們能夠看出,ra在它的生命週期中始終引用的物件a。對引用的錯誤用法經常是因為沒有理解這3個區別。
一些編譯器可能會捕捉到明顯地建立乙個null的引用的用法。
employee &anemployee = *static_cast< employee *>(0);//
錯誤然而,編譯器也可能無法檢測一些不明顯的建立null引用的用法,在執行時這會導致「未定義的行為」的錯誤發生。
employee *employee = getanemployee
();//有可能返回null指標
employee &anemployee = *employee
;//這樣的引用初始化為了null
if(&anemployee == 0)//出現錯誤:未定義的行為
乙個引用變數必須初始化的要求暗示了引用初始化時它所引用的物件必須是存在的。這一點是非常重要的:乙個引用是乙個物件的別名,這個物件必須存在於引用初始化之前。一旦這個引用初始化引用乙個物件,那麼它就不能在引用別的物件了,在它的生命週期內它是與初始化的物件繫結的。別名的特性也正是引用經常作為形參的原因。如下:
template
swap(t &a, t &b)
int a=1,b=2;
swap(a,b);//a=2,b=1
非常量的引用不能由常量來初始化,否則會提示型別轉換錯誤。當然如果這個引用是const型別,那麼同樣能夠有常量來初始化。
const int &a = 12
;const string &greeting = std::string
(「greeting!」);
當乙個引用由常值初始化是,這個引用指向了乙個臨時的位置,這個位置有常值初始化。因此a並非是引用12,而是乙個臨時的int型別,該int型別初始化為了12。一般來說,這樣的臨時變數在構造它的表示式的結尾是要被銷毀的,但是當這樣的乙個臨時值初始化了乙個const型的引用時,它的生命週期與引用變數相同。
引用 變數的別名
1.引用只可以乙個變數所賦值,賦值之後不可以再作為另乙個變數的引用。舉例 int a 0 int b 1 int r a r b error 什麼可以被引用 真值,指標變數。for instance 1.int r 1 相當於 double temp double 1 其實應該也可以是int型別 i...
指向類成員變數的指標並非指標
參考 如果你已經熟悉常規指標的宣告語法,那麼宣告乙個 指向類成員變數的指標 並不複雜 int ip 乙個指向int變數的指標 int c ip 乙個指向c類中int成員變數的指標 你必須要做的就是多寫乙個classname 來限定這個指標到底指向哪個類 乙個常規的指標包含乙個位址.如果解引用該指標,...
指向類成員變數的指標並非指標
參考 如果你已經熟悉常規指標的宣告語法,那麼宣告乙個 指向類成員變數的指標 並不複雜 int ip 乙個指向int變數的指標 int c ip 乙個指向c類中int成員變數的指標 你必須要做的就是多寫乙個classname 來限定這個指標到底指向哪個類 乙個常規的指標包含乙個位址.如果解引用該指標,...