詳解C++ 引用
引用變量是一個(gè)別名,也就是說,它是某個(gè)已存在變量的另一個(gè)名字。一旦把引用初始化為某個(gè)變量,就可以使用該引用名稱或變量名稱來指向變量。
C++ 引用 vs 指針
引用很容易與指針混淆,它們之間有三個(gè)主要的不同:
- 不存在空引用。引用必須連接到一塊合法的內(nèi)存。
- 一旦引用被初始化為一個(gè)對(duì)象,就不能被指向到另一個(gè)對(duì)象。指針可以在任何時(shí)候指向到另一個(gè)對(duì)象。
- 引用必須在創(chuàng)建時(shí)被初始化。指針可以在任何時(shí)間被初始化。
C++ 中創(chuàng)建引用
試想變量名稱是變量附屬在內(nèi)存位置中的標(biāo)簽,您可以把引用當(dāng)成是變量附屬在內(nèi)存位置中的第二個(gè)標(biāo)簽。因此,您可以通過原始變量名稱或引用來訪問變量的內(nèi)容。例如:
int i = 17;
我們可以為 i 聲明引用變量,如下所示:
int& r = i; double& s = d;
在這些聲明中,& 讀作引用。因此,第一個(gè)聲明可以讀作 "r 是一個(gè)初始化為 i 的整型引用",第二個(gè)聲明可以讀作 "s 是一個(gè)初始化為 d 的 double 型引用"。下面的實(shí)例使用了 int 和 double 引用:
#include <iostream> using namespace std; int main () { // 聲明簡(jiǎn)單的變量 int i; double d; // 聲明引用變量 int& r = i; double& s = d; i = 5; cout << "Value of i : " << i << endl; cout << "Value of i reference : " << r << endl; d = 11.7; cout << "Value of d : " << d << endl; cout << "Value of d reference : " << s << endl; return 0; }
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
Value of i : 5
Value of i reference : 5
Value of d : 11.7
Value of d reference : 11.7
引用通常用于函數(shù)參數(shù)列表和函數(shù)返回值。下面列出了 C++ 程序員必須清楚的兩個(gè)與 C++ 引用相關(guān)的重要概念:
把引用作為參數(shù)
C++ 支持把引用作為參數(shù)傳給函數(shù),這比傳一般的參數(shù)更安全。
#include <iostream> using namespace std; // 函數(shù)聲明 void swap(int& x, int& y); int main () { // 局部變量聲明 int a = 100; int b = 200; cout << "交換前,a 的值:" << a << endl; cout << "交換前,b 的值:" << b << endl; /* 調(diào)用函數(shù)來交換值 */ swap(a, b); cout << "交換后,a 的值:" << a << endl; cout << "交換后,b 的值:" << b << endl; return 0; } // 函數(shù)定義 void swap(int& x, int& y) { int temp; temp = x; /* 保存地址 x 的值 */ x = y; /* 把 y 賦值給 x */ y = temp; /* 把 x 賦值給 y */ return; }
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
交換前,a 的值: 100
交換前,b 的值: 200
交換后,a 的值: 200
交換后,b 的值: 100
把引用作為返回值
可以從 C++ 函數(shù)中返回引用,就像返回其他數(shù)據(jù)類型一樣。通過使用引用來替代指針,會(huì)使 C++ 程序更容易閱讀和維護(hù)。C++ 函數(shù)可以返回一個(gè)引用,方式與返回一個(gè)指針類似。
當(dāng)函數(shù)返回一個(gè)引用時(shí),則返回一個(gè)指向返回值的隱式指針。這樣,函數(shù)就可以放在賦值語句的左邊。例如,請(qǐng)看下面這個(gè)簡(jiǎn)單的程序:
#include <iostream> using namespace std; double vals[] = {10.1, 12.6, 33.1, 24.1, 50.0}; double& setValues( int i ) { return vals[i]; // 返回第 i 個(gè)元素的引用 } // 要調(diào)用上面定義函數(shù)的主函數(shù) int main () { cout << "改變前的值" << endl; for ( int i = 0; i < 5; i++ ) { cout << "vals[" << i << "] = "; cout << vals[i] << endl; } setValues(1) = 20.23; // 改變第 2 個(gè)元素 setValues(3) = 70.8; // 改變第 4 個(gè)元素 cout << "改變后的值" << endl; for ( int i = 0; i < 5; i++ ) { cout << "vals[" << i << "] = "; cout << vals[i] << endl; } return 0; }
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
改變前的值
vals[0] = 10.1
vals[1] = 12.6
vals[2] = 33.1
vals[3] = 24.1
vals[4] = 50
改變后的值
vals[0] = 10.1
vals[1] = 20.23
vals[2] = 33.1
vals[3] = 70.8
vals[4] = 50
當(dāng)返回一個(gè)引用時(shí),要注意被引用的對(duì)象不能超出作用域。所以返回一個(gè)對(duì)局部變量的引用是不合法的,但是,可以返回一個(gè)對(duì)靜態(tài)變量的引用。
int& func() { int q; //! return q; // 在編譯時(shí)發(fā)生錯(cuò)誤 static int x; return x; // 安全,x 在函數(shù)作用域外依然是有效的 }
以上就是詳解C++ 引用的詳細(xì)內(nèi)容,更多關(guān)于C++ 引用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++標(biāo)準(zhǔn)庫(kù)介紹及使用string類的詳細(xì)過程
C++中將string封裝為單獨(dú)的類,string?類是?C++?標(biāo)準(zhǔn)庫(kù)中的一個(gè)非常重要的類,用于表示和操作字符串,這篇文章主要介紹了C++標(biāo)準(zhǔn)庫(kù)介紹及使用string類,需要的朋友可以參考下2024-08-08基于OpenCV和C++ 實(shí)現(xiàn)圖片旋轉(zhuǎn)
這篇文章主要介紹了基于OpenCV和C++ 實(shí)現(xiàn)圖片旋轉(zhuǎn),幫助大家更好的利用c++處理圖片,感興趣的朋友可以了解下2020-12-12QT TCP實(shí)現(xiàn)簡(jiǎn)單的通信示例
這篇文章主要為大家詳細(xì)介紹了QT TCP簡(jiǎn)單的通信示例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08C++實(shí)現(xiàn)LeetCode(130.包圍區(qū)域)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(130.包圍區(qū)域),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語言內(nèi)存函數(shù)的使用及其模擬實(shí)現(xiàn)
這篇文章主要介紹了C語言內(nèi)存函數(shù)的使用及其模擬實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10Qt?TCP網(wǎng)絡(luò)通信學(xué)習(xí)
用于數(shù)據(jù)傳輸?shù)牡蛯泳W(wǎng)絡(luò)協(xié)議,多個(gè)物聯(lián)網(wǎng)協(xié)議都是基于TCP協(xié)議的,這篇文章為大家介紹了Qt?TCP網(wǎng)絡(luò)通信,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08C++優(yōu)先級(jí)隊(duì)列的使用指南與模擬實(shí)現(xiàn)
優(yōu)先級(jí)隊(duì)列是一種特殊的隊(duì)列,其中每個(gè)元素都有一個(gè)與之關(guān)聯(lián)的優(yōu)先級(jí),優(yōu)先級(jí)較高的元素會(huì)在隊(duì)列中較早地被處理,而優(yōu)先級(jí)較低的元素會(huì)在后續(xù)處理,本文給大家介紹C++優(yōu)先級(jí)隊(duì)列的使用指南與模擬實(shí)現(xiàn),需要的朋友可以參考下2023-09-09