引用,顧名思義是某乙個變數或物件的別名,對引用的操作與對其所繫結的變數或物件的操作完全等價
語法:型別 &引用名=目標變數名;
特別注意:
1.做引用符號時,&起標誌作用,與位址運算子無關
2.引用的型別必須和其所繫結的變數的型別相同
3.宣告引用的同時必須初始化,否則系統會報錯
#include
using namespace std;
intmain()
4.引用相當於變數或物件的別名,因此不能再將已有的引用名作為其他變數或物件的名字或別名
5.引用不是定義乙個新的變數或物件,因此記憶體不會為引用開闢新的空間儲存這個引用
#include
using namespace std;
intmain()
可以自行驗證,二者位址一致。
6.對陣列的引用
語法:型別 (&引用名)[陣列中元素數量]=陣列名;
#include
using namespace std;
intmain()
;int
(&b)[3
]=a;
//對陣列的引用
cout<<
&a[0
]<<
" "<<
&b[0
]
&a[1
]<<
" "<<
&b[1
]
&a[2
]<<
" "<<
&b[2
]
}
//輸出如果:
0x6ffe20
0x6ffe20
0x6ffe24
0x6ffe24
0x6ffe28
0x6ffe28
7.對指標的引用
語法:型別 *&引用名=指標名;
//可以理解為:(型別*) &引用名=指標名,即將指標的型別當成型別*
#include
using namespace std;
intmain()
//輸出如果:
0x6ffe38
0x6ffe38
例子:數值交換
#include
using namespace std;
void
swap
(int
&a,int
&b)int
main()
輸出結果為:
--
----
----
----
----
----交換前--
----
----
----
----
----
----
--value1的值為:10
value2的值為:20
----
----
----
----
----
--交換後--
----
----
----
----
----
----
--value1的值為:20
value2的值為:10
特別注意:
1.上述函式中對形參的各種操作實際上是對實參本身進行操作,而非將實參變數或物件的值拷貝給形參。
2.使用指標作為函式的形參雖然達到的效果和使用引用一樣,但當呼叫函式時仍需要為形參指標變數在記憶體中分配空間,而引用則不需要這樣,故在c++中推薦使用引用而非指標作為函式的引數。
3.如果在程式設計過程中既希望通過讓引用作為函式的引數來提高函式的程式設計效率,又希望保護傳遞的引數使其在函式中不被改變,則此時應當使用對常量的引用作為函式的引數。
4.陣列的引用作為函式的引數:c++的陣列型別是帶有長度資訊的,引用傳遞時如果指明的是陣列則必須指定陣列的長度.舉例:
#include
using namespace std;
void
func
(int
(&a)[5
])//陣列引用作為函式的引數,必須指明陣列的長度
intmain()
;func
(number)
;return0;
}
語法:const 型別 &引用名=目標變數名;
常引用不允許通過該引用對其所繫結的變數或物件進行修改
#include
using namespace std;
intmain()
特別注意:
先看下面的例子:
#include
#include
using namespace std;
string func1()
void
func2
(string &str)
intmain()
執行上面的程式編譯器會報錯。
這是由於func1()和「tomwenxing」都會在系統中產生乙個臨時物件(string物件)來儲存它們,而在c++中所有的臨時物件都是const型別的,而上面的程式試圖將const物件賦值給非const物件,這必然會使程式報錯。如果在函式func2的引數前新增const,則程式便可正常執行了。
#include
#include
using namespace std;
string func1()
void
func2
(const string &str)
intmain()
語法:型別 &函式名(形參列表)
特別注意:
1.引用作為函式的返回值時,必須在定義函式時在函式名前加&。
2.用引用作函式的返回值的最大的好處是在記憶體中不產生返回值的副本。
#include
using namespace std;
float temp;
float
fn1(
float r)
float
&fn2
(float r)
intmain()
3.不能返回區域性變數的引用。如上面的例子,如果temp是區域性變數,那麼它會在函式返回後被銷毀,此時對temp的引用就會成為「無所指」的引用,程式會進入未知狀態。
4.不能返回函式內部通過new分配的記憶體的引用。雖然不存在區域性變數的被動銷毀問題,但如果被返回的函式的引用只是作為乙個臨時變數出現,而沒有將其賦值給乙個實際的變數,那麼就可能造成這個引用所指向的空間(有new分配)無法釋放的情況(由於沒有具體的變數名,故無法用delete手動釋放該記憶體),從而造成記憶體洩漏。因此應當避免這種情況的發生
5當返回類成員的引用時,最好是const引用。這樣可以避免在無意的情況下破壞該類的成員。
6.可以用函式返回的引用作為賦值表示式中的左值
#include
using namespace std;
int value[10]
;int error=-1
;int
&func
(int n)
intmain()
在c++中,引用是除了指標外另乙個可以產生多型效果的手段。也就是說乙個基類的引用可以用來繫結其派生類的例項
class father;
//基類(父類)
class son:public father
//son是father的派生類
son son;
//son是類son的乙個例項
father &ptr=son;
//用派生類的物件初始化基類物件的使用
特別注意:
ptr只能用來訪問派生類物件中從基類繼承下來的成員。如果基類(類father)中定義的有虛函式,那麼就可以通過在派生類(類son)中重寫這個虛函式來實現類的多型。
1.在引用的使用中,單純給某個變數去別名是毫無意義的,引用的目的主要用於在函式引數的傳遞中,解決大塊資料或物件的傳遞效率和空間不如意的問題
2.用引用傳遞函式的引數,能保證引數在傳遞的過程中不產生副本,從而提高傳遞效率,同時通過const的使用,還可以保證引數在傳遞過程中的安全性
3.引用本身是目標變數或物件的別名,對引用的操作本質上就是對目標變數或物件的操作。因此能使用引用時盡量使用引用而非指標
C 引用詳解
引用的概念 引用 就是某一變數 目標 的乙個別名,對引用的操作與對變數直接操作完全一樣。引用的宣告方法 型別識別符號 引用名 目標變數名 如下 定義引用ra,它是變數a的引用,即別名。int a int ra a 1 在此不是求位址運算子,而是起標識作用。2 型別識別符號是指目標變數的型別。3 宣告...
C 引用詳解
引用的概念 引用 就是某一變數 目標 的乙個別名,對引用的操作與對變數直接操作完全一樣。引用的宣告方法 型別識別符號 引用名 目標變數名 如下 定義引用ra,它是變數a的引用,即別名。int a int ra a 1 在此不是求位址運算子,而是起標識作用。2 型別識別符號是指目標變數的型別。3 宣告...
C 「引用」詳解
引用是識別符號的 別名 或者這樣說,如果為乙個物件定義了引用,那麼這個引用就相當於這個物件的 別名 就類似於有個同學叫王明,但是他還有乙個外號,叫大毛,那麼這個大毛即是王明的別名。模擬推論,引用即是物件的別名。定義引用一般採取如下形式 型別 引用變數名 已定義的變數名 需要注意的是 定義乙個引用的時...