0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

c++引用詳細(xì)解說4

jf_78858299 ? 來源:阿Q正磚 ? 作者:阿Q正磚 ? 2023-02-15 09:43 ? 次閱讀

6、效率比較

值和引用的作為返回值類型的性能比較:

#includestruct A { int a[10000]; };A a;// 值返回A TestFunc1() { return a; } // 拷貝// 引用返回A& TestFunc2() { return a; } // 不拷貝void TestReturnByRefOrValue(){    // 以值作為函數(shù)的返回值類型            size_t begin1 = clock();    for (size_t i = 0; i < 100000; ++i)            TestFunc1();    size_t end1 = clock();    // 以引用作為函數(shù)的返回值類型            size_t begin2 = clock();    for (size_t i = 0; i < 100000; ++i)            TestFunc2();    size_t end2 = clock();    // 計算兩個函數(shù)運(yùn)算完成之后的時間            cout << "TestFunc1 time:" << end1 - begin1 << endl;    cout << "TestFunc2 time:" << end2 - begin2 << endl;}int main(){    TestReturnByRefOrValue();    return 0;}

由于傳值返回要拷貝,所以當(dāng)拷貝量大,次數(shù)多時,比較耗費(fèi)時間;而傳引用返回就不會,因為返回的就是別名。

圖片

對于返回函數(shù)作用域還在的情況,引用返回優(yōu)先。

引用傳參和傳值傳參效率比較 :

#includestruct A { int a[10000]; };void TestFunc1(A a) {}void TestFunc2(A& a) {}void TestRefAndValue(){    A a;    // 以值作為函數(shù)參數(shù)    size_t begin1 = clock();    for (size_t i = 0; i < 10000; ++i)            TestFunc1(a);    size_t end1 = clock();    // 以引用作為函數(shù)參數(shù)    size_t begin2 = clock();    for (size_t i = 0; i < 10000; ++i)            TestFunc2(a);    size_t end2 = clock();    // 分別計算兩個函數(shù)運(yùn)行結(jié)束后的時間    cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;    cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;}
int main(){ TestRefAndValue();}

還是引用快,因為引用減少拷貝次數(shù):

圖片

總結(jié):引用的作用主要體現(xiàn)在傳參和傳返回值

  • 引用傳參和傳返回值,在有些場景下可以提高性能(大對象 and 深拷貝對象 – 之后會講)。
  • 引用傳參和傳返回值,在對于輸出型參數(shù)和輸出型返回值很舒服。說人話就是形參改變,實參也改變 or 返回對象(返回值改變)。

7、常引用

const 修飾的是常變量,不可修改。

圖片

a本身都不能修改,b為a的引用,那么b也不可以修改,這樣就沒意義了。a是只讀,但是引用b具有可讀可寫的權(quán)利,該情況為權(quán)限放大,所以錯誤了。

這時,只要加 const 修飾 b ,讓 b 的權(quán)限也只有只讀,使得 權(quán)限不變 ,就沒問題了:

圖片

而如果原先變量可讀可寫,但是別名用 const 修飾,也是可以的,這種情況為 權(quán)限縮小 :

圖片

對于函數(shù)的返回值來說,也不能權(quán)限放大,例如:

int fun(){    static int n = 0;    n++;    return n;}
int main(){ int& ret = fun(); // error
return 0;}

這樣也是不行的,因為返回方式為 傳值返回 ,返回的是臨時變量,具有 常性 ,是不可改的;而引用放大了權(quán)限,所以是錯誤的;這時加 const 修飾就沒問題:

const int& ret = c(1, 2)

那么這種情況為什么不可以?

圖片

而這樣就可以了?

圖片

因為類型轉(zhuǎn)換會產(chǎn)生臨時變量 :

對于類型轉(zhuǎn)換來說,在轉(zhuǎn)換的過程中會產(chǎn)生一個個臨時變量,例如 double d = i,把i轉(zhuǎn)換后的值放到臨時變量中,把臨時變量給接收的值d

而臨時變量具有常性,不可修改,引用就加了寫權(quán)限,就錯了,因為 權(quán)限被放大了 。

小結(jié):對于引用,引用后的變量所具權(quán)限可以縮小或不變,但是不能放大(指針也適用這個說法)

作用 :在一些場景下,假設(shè) x 是一個大對象,或者是深拷貝對象,那一般都會用引用傳參,減少拷貝,如果函數(shù)中不改變 x ,盡量用 const 引用傳參。

圖片

這樣可以防止 x 被修改 ,而對于 const int& x 也可以接受權(quán)限對等或縮小的對象,甚至為常量:

圖片

結(jié)論 :const type& 可以接收各種類型的對象(變量、常量、隱式轉(zhuǎn)換)。對于輸出型參數(shù)用引用,否則用 const type&,更加安全。

8、指針和引用區(qū)別

從語法概念上來說,引用是沒有開辟空間的,而指針是開辟了空間的,但是從底層實現(xiàn)上來說,則又不一樣:

int main(){    int a = 10;
int& ra = a; ra = 20;
int* pa = &a; *pa = 20; return 0;}

匯編

圖片

lea 是取地址:我們發(fā)現(xiàn)無論引用和指針,都會取地址,且這些過程和指針一樣。

其實從匯編上,引用其實是開空間的,并且實現(xiàn)方式和指針一樣,引用其實也是用指針實現(xiàn)的。

區(qū)別匯總:

  • 引用概念上定義一個變量的 別名 ,指針存儲一個變量 地址。
  • 引用 在定義時 必須初始化 ,指針最好初始化 ,但是不初始化也不會報錯。
  • 引用在初始化時引用一個實體后 ,就不能再引用其他實體 ,而指針可以在任何時候指向任何一個同類型。
  • 沒有NULL引用,但有NULL指針。
  • 在sizeof中含義不同:引用結(jié)果為 引用類型的大小,但指針始終是 地址空間所占字節(jié)個數(shù) (32位平臺下占4個字節(jié))。
  • 引用自加即引用的實體增加1,指針自加即指針向后偏移一個類型的大小。
  • 有多級指針,但是沒有多級引用。
  • 訪問實體方式不同,指針需要顯式解引用,引用編譯器自己處理。
  • 引用比指針使用起來相對更安全。

以上全部是對c++引用的一個詳細(xì)解讀,希望大家受益良多哈。平時在寫代碼的時候多調(diào)試看看里面的原理,看看編譯器到底是怎么進(jìn)行運(yùn)行的,讓自己對編碼這塊更具有靈性!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
收藏 人收藏

    評論

    相關(guān)推薦

    Visual C++教程之C++的語言資料概述免費(fèi)下載

    本文檔詳細(xì)介紹的是Visual C++教程之C++的語言資料概述免費(fèi)下載主要內(nèi)容包括了:1 從CC++的程序結(jié)構(gòu) ,2 程序書寫規(guī)范,3
    發(fā)表于 02-15 15:59 ?3次下載
    Visual <b class='flag-5'>C++</b>教程之<b class='flag-5'>C++</b>的語言資料概述免費(fèi)下載

    C++程序設(shè)計教程之?dāng)?shù)據(jù)類型的詳細(xì)資料說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是C++程序設(shè)計教程之?dāng)?shù)據(jù)類型的詳細(xì)資料說明。1. 整型 ( int Types ) , 2.整型子類 ( sub-int Types ) , 3.浮點型
    發(fā)表于 02-21 17:18 ?3次下載
    <b class='flag-5'>C++</b>程序設(shè)計教程之?dāng)?shù)據(jù)類型的<b class='flag-5'>詳細(xì)</b>資料說明

    C++程序設(shè)計教程之C++的初步知識的詳細(xì)資料說明

    C++程序設(shè)計教程之C++的初步知識的詳細(xì)資料說明包括了:1. 從CC++,2 . 最簡單的C++
    發(fā)表于 03-14 14:48 ?31次下載
    <b class='flag-5'>C++</b>程序設(shè)計教程之<b class='flag-5'>C++</b>的初步知識的<b class='flag-5'>詳細(xì)</b>資料說明

    C++程序設(shè)計教程之?dāng)?shù)組的詳細(xì)資料說明

    本文檔詳細(xì)介紹的是C++程序設(shè)計教程之?dāng)?shù)組的詳細(xì)資料說明主要內(nèi)容包括了:1. 數(shù)組的概念,2. 一維數(shù)組的定義和引用,3. 二維數(shù)組的定義和引用
    發(fā)表于 03-14 14:48 ?10次下載
    <b class='flag-5'>C++</b>程序設(shè)計教程之?dāng)?shù)組的<b class='flag-5'>詳細(xì)</b>資料說明

    C++程序設(shè)計教程之指針的詳細(xì)資料說明

    本文檔詳細(xì)介紹的是C++程序設(shè)計教程之指針的詳細(xì)資料說明主要內(nèi)容包括了:1. 指針的概念,2. 變量與指針,3. 數(shù)組與指針,4. 字符串與指針,5. 函數(shù)與指針,6. 返回指針值的函
    發(fā)表于 03-14 16:04 ?7次下載
    <b class='flag-5'>C++</b>程序設(shè)計教程之指針的<b class='flag-5'>詳細(xì)</b>資料說明

    C++程序設(shè)計教程之基于對象的程序設(shè)計的詳細(xì)資料說明

    本文檔詳細(xì)介紹的是C++程序設(shè)計教程之基于對象的程序設(shè)計的詳細(xì)資料說明主要內(nèi)容包括了:1. 面向?qū)ο蟪绦蛟O(shè)計方法概述,2. 類的聲明和對象的定義,3. 類的成員函數(shù),4. 對象成員的
    發(fā)表于 03-14 16:04 ?5次下載
    <b class='flag-5'>C++</b>程序設(shè)計教程之基于對象的程序設(shè)計的<b class='flag-5'>詳細(xì)</b>資料說明

    C++程序設(shè)計的基礎(chǔ)知識初步了解C++的資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是C++程序設(shè)計的基礎(chǔ)知識初步了解C++的資料免費(fèi)下載包括了:1 認(rèn)識C++,2 C++的現(xiàn)狀和發(fā)展,3
    發(fā)表于 06-10 08:00 ?25次下載
    <b class='flag-5'>C++</b>程序設(shè)計的基礎(chǔ)知識初步了解<b class='flag-5'>C++</b>的資料免費(fèi)下載

    C++引用的使用場景

    C++引用的使用場景
    的頭像 發(fā)表于 06-29 15:18 ?4068次閱讀
    <b class='flag-5'>C++</b>:<b class='flag-5'>引用</b>的使用場景

    C++中的const和引用的討論

    今天給大家分享一下這段時間學(xué)習(xí)c++的總結(jié)學(xué)習(xí):c++里面的const關(guān)鍵字和引用。
    的頭像 發(fā)表于 12-24 15:35 ?852次閱讀

    C語言和C++的特點與用法詳細(xì)說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是C語言和C++的特點與用法詳細(xì)說明。
    的頭像 發(fā)表于 12-26 10:58 ?4421次閱讀

    C++基礎(chǔ)語法中的引用、封裝和多態(tài)

    本期是C++基礎(chǔ)語法分享的第六節(jié),今天給大家來分享一下: (1)引用; (2)宏; (3)成員初始化列表; (4)封裝; (5)繼承; (6)多態(tài); 引用 左值
    的頭像 發(fā)表于 09-12 09:58 ?1315次閱讀

    c++引用詳細(xì)解說1

    C++C語言的繼承,它可進(jìn)行過程化程序設(shè)計,又可以進(jìn)行以抽象數(shù)據(jù)類型為特點的基于對象的程序設(shè)計,還可以進(jìn)行以繼承和多態(tài)為特點的面向?qū)ο蟮某绦蛟O(shè)計。
    的頭像 發(fā)表于 02-15 09:40 ?589次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>引用</b><b class='flag-5'>詳細(xì)</b><b class='flag-5'>解說</b>1

    c++引用詳細(xì)解說2

    C++C語言的繼承,它可進(jìn)行過程化程序設(shè)計,又可以進(jìn)行以抽象數(shù)據(jù)類型為特點的基于對象的程序設(shè)計,還可以進(jìn)行以繼承和多態(tài)為特點的面向?qū)ο蟮某绦蛟O(shè)計。
    的頭像 發(fā)表于 02-15 09:43 ?507次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>引用</b><b class='flag-5'>詳細(xì)</b><b class='flag-5'>解說</b>2

    c++引用詳細(xì)解說3

    C++C語言的繼承,它可進(jìn)行過程化程序設(shè)計,又可以進(jìn)行以抽象數(shù)據(jù)類型為特點的基于對象的程序設(shè)計,還可以進(jìn)行以繼承和多態(tài)為特點的面向?qū)ο蟮某绦蛟O(shè)計。
    的頭像 發(fā)表于 02-15 09:43 ?540次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>引用</b><b class='flag-5'>詳細(xì)</b><b class='flag-5'>解說</b>3

    C++引用和指針

    之前的文章我們已經(jīng)介紹了C++中的基本類型如int,bool和double等,除了基本類型C++還有一些更復(fù)雜的數(shù)據(jù)類型復(fù)合類型,所謂的復(fù)合類型就是通過其他類型定義的類型,本篇文章我們將會著重介紹C++的復(fù)合類型
    的頭像 發(fā)表于 03-17 14:00 ?636次閱讀