最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++左值和右值學(xué)習(xí)筆記

 更新時(shí)間:2023年10月31日 09:13:06   作者:Totn  
這篇文章主要為大家介紹了C++左值和右值學(xué)習(xí)筆記的重點(diǎn)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

來看一行簡(jiǎn)單的代碼

int a = 10;

這行代碼,"=" 左邊就是左值,"="右邊的則為右值,那他們到底有什么不同呢?

如果是Java、PHP等后端同學(xué),會(huì)稱以左邊的"a"為變量,右邊的"10"為字面量,而到了C++這里,我們就需要對(duì)他理解更多一點(diǎn)。

這行代碼運(yùn)行起來,是在系統(tǒng)內(nèi)存中申請(qǐng)了一塊空間,命名為"a",然后把"10"這個(gè)值裝入了這個(gè)單內(nèi)存空間中,內(nèi)存中的空間是有地址的,并且和"a"這個(gè)名字綁在一起,當(dāng)我們提到"a",就能知道他所代表的內(nèi)存地址,這也是所謂的"可尋址"。

在C++中,每個(gè)表達(dá)式都具有一個(gè)值和一個(gè)類型。左值和右值描述了表達(dá)式的可尋址性和持久性。

首先,讓我們來看一下左值的概念。左值是指可以被取地址的表達(dá)式,或者說具有標(biāo)識(shí)符的表達(dá)式。左值表示一個(gè)內(nèi)存位置,它具有持久性,可以在程序的不同部分訪問和修改。簡(jiǎn)而言之,左值可以出現(xiàn)在賦值運(yùn)算符的左邊。

左值的特點(diǎn)

int x = 10;     // 'x' 是一個(gè)左值,可以被賦值
int* p = &x;    // '&x' 是一個(gè)左值,可以取其地址
int arr[5];     // 'arr' 是一個(gè)左值,可以被訪問和修改

接下來,我們來看一下右值的概念。右值是指不可被取地址的表達(dá)式,或者說臨時(shí)生成的表達(dá)式。右值表示一個(gè)臨時(shí)的值,它通常只能用于賦值或傳遞給函數(shù),沒有持久性。簡(jiǎn)而言之,右值可以出現(xiàn)在賦值運(yùn)算符的右邊。

右值的特點(diǎn)

int a = 5;              // '5' 是一個(gè)右值
int b = a + 3;          // 'a + 3' 是一個(gè)右值
int* ptr = new int(10); // 'new int(10)' 返回一個(gè)右值

需要注意的是,C++11引入了右值引用的概念,即可以對(duì)右值進(jìn)行引用的類型。右值引用允許我們更有效地管理資源,如移動(dòng)語義和完美轉(zhuǎn)發(fā)。

綜上所述,左值表示持久的可尋址表達(dá)式,而右值表示臨時(shí)的不可尋址表達(dá)式。理解左值和右值的概念對(duì)于理解C++中的賦值、函數(shù)調(diào)用和參數(shù)傳遞等操作是非常重要的。

函數(shù)返回值

那么,一個(gè)函數(shù)返回值,應(yīng)該是左值還是右值?

當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),它會(huì)在棧上創(chuàng)建一個(gè)新的幀來存儲(chǔ)該函數(shù)的局部變量、參數(shù)以及其他信息。該幀在函數(shù)返回時(shí)銷毀。

因?yàn)楹瘮?shù)返回值通常是通過寄存器或者特殊寄存器(如eax)返回的,它們的地址在棧幀被銷毀后就不能再訪問了。所以不能直接對(duì)函數(shù)返回值取址。

但是,如果你需要返回一個(gè)指向已經(jīng)存在的內(nèi)存塊的指針,然后在函數(shù)外使用該指針訪問內(nèi)存塊,那么是可以的。例如:

int* foo() {
    int x = 10;
    return &x;
}

int main() {
    int* p = foo();
    std::cout << *p; // undefined behavior
    return 0;
}

上述代碼中的foo()函數(shù)返回了一個(gè)指向局部變量x的指針。

這會(huì)導(dǎo)致undefined behavior,因?yàn)閤在函數(shù)返回時(shí)就被銷毀了,所以p指向的內(nèi)存塊中可能包含任意的值。

所以,不能直接對(duì)函數(shù)返回值取址,函數(shù)返回值是一個(gè)右值。

但如何函數(shù)返回的是指向已經(jīng)存在的內(nèi)存塊的指針,即不是函數(shù)內(nèi)定義的東西,那么取址是沒有問題的。

以上就是C++左值和右值學(xué)習(xí)筆記的詳細(xì)內(nèi)容,更多關(guān)于C++左值 右值的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++ 虛函數(shù)表圖文解析

    C++ 虛函數(shù)表圖文解析

    最近學(xué)了設(shè)計(jì)模式中的簡(jiǎn)單工廠模式,對(duì)多態(tài)有了具體的認(rèn)識(shí)。于是補(bǔ)了補(bǔ)多態(tài)、虛函數(shù)、虛函數(shù)表相關(guān)的知識(shí),本文介紹了C++ 虛函數(shù)表,感興趣的了解一下
    2021-05-05
  • 談?wù)凜++學(xué)習(xí)之Pair的使用方法

    談?wù)凜++學(xué)習(xí)之Pair的使用方法

    pair是一種模板類型,其中包含兩個(gè)數(shù)據(jù)值,兩個(gè)數(shù)據(jù)的類型可以不同,本篇詳細(xì)的介紹了Pair的使用方法和實(shí)例,有興趣的同學(xué)可以了解一下。
    2016-12-12
  • C++ 標(biāo)準(zhǔn)庫(kù) <chrono>的具體使用

    C++ 標(biāo)準(zhǔn)庫(kù) <chrono>的具體使用

    chrono>引入于 C++11,提供了類型安全的時(shí)間度量體系,本文就來詳細(xì)的介紹一下<chrono>的使用,感興趣的可以了解一下
    2026-02-02
  • C++11新特性全解析新的類功能、lambda、包裝器詳解

    C++11新特性全解析新的類功能、lambda、包裝器詳解

    本文主要介紹了C++11中新增的移動(dòng)語義、默認(rèn)函數(shù)、刪除函數(shù)、override和final關(guān)鍵字,以及STL中的新容器和接口、lambda表達(dá)式、function和bind函數(shù)模板,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • C++中的std::funture和std::promise實(shí)例詳解

    C++中的std::funture和std::promise實(shí)例詳解

    在線程池中獲取線程執(zhí)行函數(shù)的返回值時(shí),通常使用 std::future 而不是 std::promise 來傳遞返回值,這篇文章主要介紹了C++中的std::funture和std::promise實(shí)例詳解,需要的朋友可以參考下
    2024-05-05
  • 教你分辨C++堆與棧的區(qū)別

    教你分辨C++堆與棧的區(qū)別

    堆與棧的區(qū)別有:1、棧由系統(tǒng)自動(dòng)分配,而堆是人為申請(qǐng)開辟;2、棧獲得的空間較小,而堆獲得的空間較大;3、棧由系統(tǒng)自動(dòng)分配,速度較快,而堆一般速度比較慢;4、棧是連續(xù)的空間,而堆是不連續(xù)的空間
    2021-06-06
  • C++中overload,override,overwrite的區(qū)別詳細(xì)解析

    C++中overload,override,overwrite的區(qū)別詳細(xì)解析

    以下是對(duì)C++中overload,override,overwrite的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • 淺談const變量賦值報(bào)錯(cuò)分析

    淺談const變量賦值報(bào)錯(cuò)分析

    在類中 只有靜態(tài)變量能賦值 如果你不賦值 編譯器會(huì)認(rèn)為你這個(gè)變量根本沒用 不能被修改 又沒有初始值 兩個(gè)辦法 在構(gòu)造函數(shù)的初始化列表賦值 或者在const前面加一個(gè)static
    2015-07-07
  • VScode上配置 c語言環(huán)境的圖文教程

    VScode上配置 c語言環(huán)境的圖文教程

    這篇文章主要介紹了配置VScode c語言環(huán)境,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • C++編譯期字符串處理方法

    C++編譯期字符串處理方法

    這篇文章給大家介紹了C++編譯期字符串處理方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2026-03-03

最新評(píng)論

武强县| 樟树市| 东兴市| 确山县| 双桥区| 垣曲县| 青冈县| 普定县| 手游| 稷山县| 古浪县| 高清| 大渡口区| 雅安市| 仪征市| 于田县| 五原县| 新龙县| 葫芦岛市| 精河县| 廉江市| 三门峡市| 和田市| 建阳市| 广南县| 云和县| 玉龙| 什邡市| 东丽区| 无为县| 老河口市| 甘泉县| 龙海市| 建宁县| 乌拉特后旗| 三都| 南昌市| 于都县| 中阳县| 湖州市| 咸丰县|