欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++詳細分析講解引用的概念與使用

 更新時間:2022年05月11日 10:53:35   作者:beyond.myself  
引用(reference)就是C++對C語言的重要擴充。引用就是某一變量(目標)的一個別名,對引用的操作與對變量直接操作完全一樣

1.引用的概念

引用不是新定義一個變量,而是給已存在變量取了一個別名,編譯器不會為引用變量開辟內存空間,它和它引用的變量共用同一塊內存空間。

2.引用的格式

類型 & 引用變量名 ( 對象名 ) = 引用實體;

舉例如下:

注意:引用類型必須和引用實體是同種類型的

3.引用的特性

(1). 引用在 定義時必須初始化

例如:int& d; 這樣就是沒有初始化是錯的

(2). 一個變量可以有多個引用

    int a = 10;
    int& b = a;
    int& c = b;
    int* p = &b;    //p是指針

(3). 引用一旦引用一個實體,再不能引用其他實體

4.取別名原則

對原引用變量,權限只能縮小,即 可讀可寫(普通類型) 可以改成 只讀(const);不能放大:,即 只讀 不能改成 可讀可寫的

例子1:權限的放大,不能把const給非const

例子2:權限的縮小 非const 既可以給非const,也可以給const:

例子3:權限縮小和放大規(guī)則:適用于引用和指針間

例子4: 權限不適用于普通賦值:

難點:隱式類型轉換的引用

整形e能否做雙精度浮點型d的別名呢?

直接賦值是不行的,需要加上const才正確。即:const int& e = d; 正確

解釋:隱式類型轉換的普通賦值的情況,上面的例子:int f=d;從語法上看把8字節(jié)的d不能直接給4字節(jié)的f,因為浮點數(shù)和整形的存儲形式就不一樣,沒辦法直接截取,所以d需要先把整數(shù)部分給一個4字節(jié)的臨時變量,再把臨時變量給f

再看引用:int& e=d; 臨時變量具有常性,所以這里把臨時變量給引用e的時候,相當于是把自帶const的臨時變量賦值給非const的e,把只讀的給可讀可寫的是放大了權限,所以錯誤;必須改成const int& e=d;才正確!

5.引用的使用場景

做參數(shù)

(1)傳參:實參給形參傳值和傳地址都需要傳一份值/地址的拷貝,引用傳參可以減少拷貝,提高效率

void Swap(int& x, int& y)
{
	int tmp = x;
	x = y;
	y = tmp;
}
void Swap(double& x, double& y)
{
	double tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 0, b = 1;
	swap(a, b);
	double c = 1.1, d = 2.2;
	swap(c, d);
	return 0;
}

(2)作輸出型參數(shù):

leetcode上的題往往有輸出型參數(shù),在c++中就可以用引用代替更加方便

做返回值

int&Count()的講解

傳值返回:會有一個拷貝

傳引用返回:沒有這個拷貝了,函數(shù)返回的直接就是返回變量的別名

int& Count()
{
	int n = 0;
	n++;
	return n;
}
int main()
{
	int ret = Count();
	return 0;
}

首先我們來看普通的傳值返回:普通的傳值返回需要把返回值n給一個函數(shù)類型int的臨時變量(函數(shù)類型就是返回值類型),再把臨時變量給ret。

為什么設計一個臨時變量,直接把n給ret不行嗎?

答:不行,因為當函數(shù)Count里執(zhí)行完各種代碼后,返回n,等出了Count函數(shù)的作用域后n就會銷毀,所以不能直接把n給ret,需要一個臨時變量。

如何證明返回時存在臨時變量呢?:如果你用int& ret 接收,寫成int& ret = Count(); 發(fā)現(xiàn)無法運行,因為臨時變量有常性,所以需要寫成const int& ret = Count();才能通過。

此時再看傳引用返回:

當用引用接收引用返回時:這里ret和n的地址一樣,也就意味著ret其實就是n的別名。但是因為n出作用域不會立即被覆蓋,所以第一次通過ret可以打印是1,當打印第二次時,因為前面已經調用過一次打印函數(shù),已 "銷毀" 的Count函數(shù)棧幀在此時被打印函數(shù)覆蓋,再打印ret就會是隨機數(shù)了!

即:如果函數(shù)返回時,出了函數(shù)作用域,如果返回對象還未還給系統(tǒng),則可以使用引用返回,如果已 經還給系統(tǒng)了,則必須使用傳值返回。

用static修飾n后:用static靜態(tài)變量使n只初始化一次且改變其生命周期,把n放進了靜態(tài)區(qū),這樣n就一直存在,就可以通過ret找到n了,再怎么打印ret都是1.

傳值傳引用效率比較

以值作為參數(shù)或者返回值類型,在傳參和返回期間,函數(shù)不會直接傳遞實參或者將變量本身直接返回,而是傳遞實參或者返回變量的一份臨時的拷貝,因此用值作為參數(shù)或者返回值類型,效率是非常低下的,尤其是 當參數(shù)或者返回值類型非常大時,效率就更低。 總結:傳值和指針在作為傳參以及返回值類型上效率相差很大 。

6.引用和指針的不同點

1. 引用 在定義時 必須初始化 ,指針沒有要求

2. 引用 在初始化時引用一個實體后,就 不能再引用其他實體 ,而指針可以在任何時候指向任何一個同類型 實體

3. 沒有 NULL 引用 ,但有 NULL 指針

4. 在 sizeof 中含義不同 : 引用 結果為 引用類型的大小 ,但 指針 始終是 地址空間所占字節(jié)個數(shù) (32 位平臺下占 4 個字節(jié) )

5. 引用自加即引用的實體增加 1 ,指針自加即指針向后偏移一個類型的大小

6. 有多級指針,但是沒有多級引用

7. 訪問實體方式不同, 指針需要顯式解引用,引用編譯器自己處理

8. 引用比指針使用起來相對更安全

引用和指針在語法上是不一樣的,但是實際上從反匯編的代碼上我們能看到引用和指針的底層實現(xiàn)是一樣的!

這就好比保時捷的卡宴和大眾的途銳汽車,他們的三大件底盤,發(fā)動機,變速箱都是一樣的,但是他們的品牌不一樣,價格不同

到此這篇關于C++詳細分析講解引用的概念與使用的文章就介紹到這了,更多相關C++引用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言實現(xiàn)俄羅斯方塊

    C語言實現(xiàn)俄羅斯方塊

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)俄羅斯方塊,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C語言MFC基礎之計算器詳解

    C語言MFC基礎之計算器詳解

    這篇文章主要為大家介紹了MFC實現(xiàn)簡單的計算器,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-08-08
  • opengl實現(xiàn)直線掃描算法和區(qū)域填充算法

    opengl實現(xiàn)直線掃描算法和區(qū)域填充算法

    這篇文章主要為大家詳細介紹了opengl實現(xiàn)直線掃描算法和區(qū)域填充算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C語言通訊錄實例分享

    C語言通訊錄實例分享

    這篇文章主要為大家分享了C語言通訊錄實例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 詳解C++字符串常用操作函數(shù)(查找、插入、截取、刪除等)

    詳解C++字符串常用操作函數(shù)(查找、插入、截取、刪除等)

    這篇文章主要介紹了C++字符串常用操作函數(shù)(查找、插入、截取、刪除等),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • C++中回調函數(shù)及函數(shù)指針的實例詳解

    C++中回調函數(shù)及函數(shù)指針的實例詳解

    這篇文章主要介紹了C++中回調函數(shù)及函數(shù)指針的實例詳解的相關資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內容,需要的朋友可以參考下
    2017-10-10
  • 深入linux下遍歷目錄樹的方法總結分析

    深入linux下遍歷目錄樹的方法總結分析

    本篇文章是對linux下遍歷目錄樹的方法進行了詳細的總結與分析,需要的朋友參考下
    2013-05-05
  • C++二叉樹的直徑與合并詳解

    C++二叉樹的直徑與合并詳解

    這篇文章主要為大家詳細介紹了C++實現(xiàn)二叉樹基本操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-08-08
  • C++ STL 內 std::{bind/tuple/function} 簡單實現(xiàn)

    C++ STL 內 std::{bind/tuple/function} 簡單實現(xiàn)

    這篇文章主要介紹了C++ STL 內 std::{bind/tuple/function} 簡單實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • 基于MFC實現(xiàn)類的序列化詳解

    基于MFC實現(xiàn)類的序列化詳解

    序列化是將程序中的對象以一種二進制格式存儲到存儲設備中(例如文本/數(shù)據(jù)庫等),以實現(xiàn)“永生”或隨意“流動”。本文將為大家詳細講講如何基于MFC實現(xiàn)類的序列化,需要的可以參考一下
    2022-07-07

最新評論