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

C++關(guān)于const與引用的分析講解

 更新時(shí)間:2022年04月20日 16:55:01   作者:清風(fēng)自在?流水潺潺  
Const?是C++中常用的類型修飾符,常類型是指使用類型修飾符const說(shuō)明的類型,常類型的變量或?qū)ο蟮闹凳遣荒鼙桓碌?,引用變量是一個(gè)別名,也就是說(shuō),它是某個(gè)已存在變量的另一個(gè)名字。一旦把引用初始化為某個(gè)變量,就可以使用該引用名稱或變量名稱來(lái)指向變量

一、關(guān)于 const 的疑問(wèn)

const 什么時(shí)候?yàn)橹蛔x變量?什么時(shí)候是常量?

const 常量的判別準(zhǔn)則

  • 只有用字面量初始化的 const 常量才會(huì)進(jìn)入符號(hào)表
  • 使用其他變量初始化的 const 常量仍然是只讀變量
  • 被 volatile 修飾的 const 常量不會(huì)進(jìn)入符號(hào)表

注:在編譯期間不能直接確定初始值的 const 標(biāo)識(shí)符,都被作為只讀變量處理。

const 引用的類型與初始化變量的類型 如果相同,則初始化變量成為只讀變量;如果不同 ,則生成一個(gè)新的只讀變量。

下面看一段 const 典型問(wèn)題分析的代碼:

#include <stdio.h>
 
int main()
{
    const int x = 1;
    const int& rx = x;
    int& nrx = const_cast<int&>(rx);
    nrx = 5;
    printf("x = %d\n", x);
    printf("rx = %d\n", rx);
    printf("nrx = %d\n", nrx);
    printf("&x = %p\n", &x);
    printf("&rx = %p\n", &rx);
    printf("&nrx = %p\n", &nrx);
    volatile const int y = 2;
    int* p = const_cast<int*>(&y);
    *p = 6;
    printf("y = %d\n", y);
    printf("p = %p\n", p);
    const int z = y;
    p = const_cast<int*>(&z);
    *p = 7;
    printf("z = %d\n", z);
    printf("p = %p\n", p);
    char c = 'c';
    char& rc = c;
    const int& trc = c;
    rc = 'a';
    printf("c = %c\n", c);
    printf("rc = %c\n", rc);
    printf("trc = %c\n", trc);
    return 0;
}

下面為輸出結(jié)果:

第一個(gè)需要注意的地方就是 使用字面量初始化的 const 常量才會(huì)進(jìn)入符號(hào)表,所以打印出的x的值為1,而不是5。rx 代表的是 C++ 編譯器為 x 常量分配但是沒(méi)有使用的空間,為只讀變量。const_cast 消除了只讀變量的只讀屬性,所以得到的 nrx 為一個(gè)普通變量,且 nrx 也代表一個(gè)內(nèi)存空間,這段內(nèi)存空間與 rx 代表的內(nèi)存空間為同一段。所以運(yùn)行后 x,rx以及 nrx 所代表的的地址都是一樣。

第二個(gè)需要注意的地方就是被 volatile 修飾的 const 常量不會(huì)進(jìn)入符號(hào)表,所以修飾的常量為只讀變量。const_cast 消除了 y 地址的只讀屬性,所以可以用一個(gè)普通指針 p 指向 y 的地址,所以改變 p 指針里面的內(nèi)容,y 的值也會(huì)改變。

第三個(gè)需要注意的地方就是使用其他變量初始化的 const 常量仍然是只讀變量。所以令 const int z = y 后,依然可以使用指針改變 z 的值。

第四個(gè)需要注意的地方就是const 引用的類型與初始化變量的類型 如果相同,則初始化變量成為只讀變量;如果不同 ,則生成一個(gè)新的只讀變量。所以 trc 的值和上面的 c 和 rc不一樣。

二、關(guān)于引用的疑問(wèn)

引用與指針有什么關(guān)系?如何理解“引用的本質(zhì)就是指針常量”?

指針是一個(gè)變量

  • 值為一個(gè)內(nèi)存地址,不需要初始化,可以保存不同的地址
  • 通過(guò)指針可以訪問(wèn)對(duì)應(yīng)內(nèi)存地址中的值
  • 指針可以被 const 修飾成為常量或者只讀變量

引用只是一個(gè)變量的新名字

  • 對(duì)引用的操作(賦值,取地址等)都會(huì)傳遞到代表的變量上
  • const 引用使其代表的變量具有只讀屬性
  • 引用必須在定義時(shí)初始化,之后無(wú)法代表其它變量

從使用 C++ 語(yǔ)言的角度來(lái)看

  • 引用與指針沒(méi)有任何的關(guān)系
  • 引用是變量的新名字,操作引用就是操作對(duì)應(yīng)的變量

從 C++ 編譯器的角度來(lái)看

  • 為了支持新概念“引用”必須要一個(gè)有效的解決方案
  • 在編譯器內(nèi)部,使用指針常量來(lái)實(shí)現(xiàn)“引用”
  • 因此“引用”在定義時(shí)必須初始化

在工程項(xiàng)目開發(fā)中

  • 當(dāng)進(jìn)行 C++ 編程時(shí),直接站在使用的角度看待引用,與指針毫無(wú)關(guān)系,引用就是變量的別名
  • 當(dāng)對(duì) C++ 代碼進(jìn)行調(diào)試分析時(shí),一些特殊情況,可以考慮站在C++編譯器的角度看待引用

下面看一段引用典型問(wèn)題分析:

#include <stdio.h>
 
int a = 1;
struct SV
{
    int& x;
    int& y;
    int& z;
};
int main()
{
    int b = 2;
    int* pc = new int(3);
    SV sv = {a, b, *pc};
    //int& array[] = {a, b, *pc}; // &array[1] - &array[0] = ?  Expected ==> 4
    printf("&sv.x = %p\n", &sv.x);
    printf("&sv.y = %p\n", &sv.y);
    printf("&sv.z = %p\n", &sv.z);
    delete pc;
    return 0;
}

下面為輸出結(jié)果:

在C語(yǔ)言和 C++ 中數(shù)組的地址都是遞增的,而在該代碼中可以看到第1個(gè)元素的地址減去第二個(gè)元素的地址不為4,所以說(shuō)明C++中不支持引用數(shù)組。

三、小結(jié)

  • 指針是一個(gè)變量
  • 引用是一個(gè)變量的新名字
  • const 引用能夠生成新的只讀變量
  • 在編譯器內(nèi)部使用指針常量實(shí)現(xiàn)“引用”
  • 編譯時(shí)不能直接確定初始值的 const 標(biāo)識(shí)符都是只讀變量

到此這篇關(guān)于C++關(guān)于const與引用的分析講解的文章就介紹到這了,更多相關(guān)C++const與引用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt實(shí)現(xiàn)簡(jiǎn)單TCP服務(wù)器

    Qt實(shí)現(xiàn)簡(jiǎn)單TCP服務(wù)器

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)簡(jiǎn)單TCP服務(wù)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語(yǔ)言 指針變量作為函數(shù)參數(shù)詳解

    C語(yǔ)言 指針變量作為函數(shù)參數(shù)詳解

    本文主要介紹C語(yǔ)言 指針變量作為函數(shù)參數(shù),這里整理了相關(guān)資料和示例代碼,以便大家學(xué)習(xí)參考理解知識(shí)點(diǎn),有需要的小伙伴可以參考下
    2016-08-08
  • C語(yǔ)言實(shí)現(xiàn)快速排序

    C語(yǔ)言實(shí)現(xiàn)快速排序

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)快速排序算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • C++語(yǔ)言數(shù)據(jù)結(jié)構(gòu) 串的基本操作實(shí)例代碼

    C++語(yǔ)言數(shù)據(jù)結(jié)構(gòu) 串的基本操作實(shí)例代碼

    這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu) 串的基本操作實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • C++核心編程之類和對(duì)象詳解

    C++核心編程之類和對(duì)象詳解

    這篇文章主要介紹了C++編程進(jìn)階之類和對(duì)象用法等相關(guān)使用技巧,需要的朋友可以參考下,希望能夠給你帶來(lái)幫助
    2021-09-09
  • 淺談C++11新引入的lambda表達(dá)式

    淺談C++11新引入的lambda表達(dá)式

    Lambda表達(dá)式(又稱Lambda函數(shù),英文原文是Lambda Expression),是C++11的新特性中非常實(shí)用的一個(gè)。
    2017-07-07
  • C++基于Floyd算法實(shí)現(xiàn)校園導(dǎo)航系統(tǒng)

    C++基于Floyd算法實(shí)現(xiàn)校園導(dǎo)航系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++基于Floyd算法實(shí)現(xiàn)校園導(dǎo)航系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語(yǔ)言修煉之路函數(shù)篇真題訓(xùn)練上

    C語(yǔ)言修煉之路函數(shù)篇真題訓(xùn)練上

    函數(shù)是一組一起執(zhí)行一個(gè)任務(wù)的語(yǔ)句。每個(gè)?C?程序都至少有一個(gè)函數(shù),即主函數(shù)?main()?,所有簡(jiǎn)單的程序都可以定義其他額外的函數(shù)
    2022-03-03
  • C++中的const限定符的使用和作用

    C++中的const限定符的使用和作用

    C++ 中的 const 限定符用于聲明不可變量,即在變量聲明時(shí)指定該變量的值不可修改。它的使用可以幫助程序員避免一些常見的編程錯(cuò)誤,如誤修改不應(yīng)該被修改的變量的值等
    2023-05-05
  • 通過(guò)示例詳解C++智能指針

    通過(guò)示例詳解C++智能指針

    這篇文章主要為大家通過(guò)示例介紹了C++智能指針的使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03

最新評(píng)論

龙海市| 离岛区| 德令哈市| 丽江市| 永新县| 门源| 天门市| 定日县| 北票市| 鄂托克旗| 武邑县| 科技| 宁强县| 买车| 镇巴县| 辰溪县| 宁国市| 明溪县| 虹口区| 曲沃县| 册亨县| 安远县| 托克托县| 武功县| 志丹县| 上犹县| 辛集市| 江陵县| 天祝| 海丰县| 宁波市| 水城县| 阳谷县| 富民县| 平湖市| 梅州市| 古田县| 深水埗区| 义乌市| 韶山市| 安龙县|