衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

c++引用詳細解說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(){    // 以值作為函數的返回值類型            size_t begin1 = clock();    for (size_t i = 0; i < 100000; ++i)            TestFunc1();    size_t end1 = clock();    // 以引用作為函數的返回值類型            size_t begin2 = clock();    for (size_t i = 0; i < 100000; ++i)            TestFunc2();    size_t end2 = clock();    // 計算兩個函數運算完成之后的時間            cout << "TestFunc1 time:" << end1 - begin1 << endl;    cout << "TestFunc2 time:" << end2 - begin2 << endl;}int main(){    TestReturnByRefOrValue();    return 0;}

由于傳值返回要拷貝,所以當拷貝量大,次數多時,比較耗費時間;而傳引用返回就不會,因為返回的就是別名。

圖片

對于返回函數作用域還在的情況,引用返回優先。

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

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

還是引用快,因為引用減少拷貝次數:

圖片

總結:引用的作用主要體現在傳參和傳返回值

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

7、常引用

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

圖片

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

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

圖片

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

圖片

對于函數的返回值來說,也不能權限放大,例如:

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

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

const int& ret = c(1, 2)

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

圖片

而這樣就可以了?

圖片

因為類型轉換會產生臨時變量 :

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

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

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

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

圖片

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

圖片

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

8、指針和引用區別

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

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

匯編

圖片

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

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

區別匯總:

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

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137740
  • C++
    C++
    +關注

    關注

    22

    文章

    2114

    瀏覽量

    73860
  • 面向對象
    +關注

    關注

    0

    文章

    64

    瀏覽量

    10004
收藏 人收藏

    評論

    相關推薦

    C++入門教程之C++程序設計的課件資料免費下載

    本文檔的主要內容詳細介紹的是C++入門教程之C++程序設計的課件資料免費下載主要內容包括了:1. 認識C++2. C++的現狀和發展3.
    發表于 12-07 08:00 ?33次下載
    <b class='flag-5'>C++</b>入門教程之<b class='flag-5'>C++</b>程序設計的課件資料免費下載

    Visual C++教程之C++的語言資料概述免費下載

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

    C++程序設計教程之數據類型的詳細資料說明

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

    C++程序設計教程之C++的初步知識的詳細資料說明

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

    C++程序設計教程之數組的詳細資料說明

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

    C++程序設計教程之指針的詳細資料說明

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

    C++程序設計教程之基于對象的程序設計的詳細資料說明

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

    C++程序設計的基礎知識初步了解C++的資料免費下載

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

    C++引用的使用場景

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

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

    今天給大家分享一下這段時間學習c++的總結學習:c++里面的const關鍵字和引用
    的頭像 發表于 12-24 15:35 ?890次閱讀

    C++基礎語法中的引用、封裝和多態

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

    c++引用詳細解說1

    C++C語言的繼承,它可進行過程化程序設計,又可以進行以抽象數據類型為特點的基于對象的程序設計,還可以進行以繼承和多態為特點的面向對象的程序設計。
    的頭像 發表于 02-15 09:40 ?633次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>引用</b><b class='flag-5'>詳細</b><b class='flag-5'>解說</b>1

    c++引用詳細解說2

    C++C語言的繼承,它可進行過程化程序設計,又可以進行以抽象數據類型為特點的基于對象的程序設計,還可以進行以繼承和多態為特點的面向對象的程序設計。
    的頭像 發表于 02-15 09:43 ?545次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>引用</b><b class='flag-5'>詳細</b><b class='flag-5'>解說</b>2

    c++引用詳細解說3

    C++C語言的繼承,它可進行過程化程序設計,又可以進行以抽象數據類型為特點的基于對象的程序設計,還可以進行以繼承和多態為特點的面向對象的程序設計。
    的頭像 發表于 02-15 09:43 ?587次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>引用</b><b class='flag-5'>詳細</b><b class='flag-5'>解說</b>3

    C++引用和指針

    之前的文章我們已經介紹了C++中的基本類型如int,bool和double等,除了基本類型C++還有一些更復雜的數據類型復合類型,所謂的復合類型就是通過其他類型定義的類型,本篇文章我們將會著重介紹C++的復合類型
    的頭像 發表于 03-17 14:00 ?682次閱讀
    大发8887s88| 大发888娱乐场官网官方下载| 至尊百家乐官网20130402| 百家乐能赢到钱吗| 寻乌县| 大发888微信公众号2| 英山县| 大发888娱乐场 17| 百家乐国际娱乐平台| 方形百家乐官网筹码| 金臂百家乐官网开户送彩金 | 网络百家乐赌博视频| 战神百家乐官网的玩法技巧和规则| 百家乐官网在线直播| 足球博彩论坛| 太阳城御园| 百家乐长龙技巧| 太阳城百家乐筹码租| 希尔顿百家乐官网娱乐城 | 同花顺百家乐官网娱乐城| 百家乐官网电子路单破解| 称多县| 188比分直播网| 大发888娱乐官网| 百家乐最好投注法是怎样的去哪儿能了解一下啊 | 德州扑克游戏规则| 大发888游戏官方下| 全讯网hg33.com| 威尼斯人娱乐场 澳门赌场| 去澳门百家乐的玩法技巧和规则| 百家乐自动下注| 门赌场百家乐的规则| 如何赢百家乐官网的玩法技巧和规则 | 百家乐官网网址哪里有| 威信县| 百家乐官网游戏规测| 打百家乐官网的介绍| 夏邑县| 百家乐官网庄闲出现几率| 百家乐官网软件骗人吗| 百家乐官网玩法最多的娱乐城 |