亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++關于const與引用的分析講解

 更新時間:2022年04月20日 16:55:01   作者:清風自在?流水潺潺  
Const?是C++中常用的類型修飾符,常類型是指使用類型修飾符const說明的類型,常類型的變量或對象的值是不能被更新的,引用變量是一個別名,也就是說,它是某個已存在變量的另一個名字。一旦把引用初始化為某個變量,就可以使用該引用名稱或變量名稱來指向變量

一、關于 const 的疑問

const 什么時候為只讀變量?什么時候是常量?

const 常量的判別準則

  • 只有用字面量初始化的 const 常量才會進入符號表
  • 使用其他變量初始化的 const 常量仍然是只讀變量
  • 被 volatile 修飾的 const 常量不會進入符號表

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

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

下面看一段 const 典型問題分析的代碼:

#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;
}

下面為輸出結果:

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

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

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

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

二、關于引用的疑問

引用與指針有什么關系?如何理解“引用的本質就是指針常量”?

指針是一個變量

  • 值為一個內存地址,不需要初始化,可以保存不同的地址
  • 通過指針可以訪問對應內存地址中的值
  • 指針可以被 const 修飾成為常量或者只讀變量

引用只是一個變量的新名字

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

從使用 C++ 語言的角度來看

  • 引用與指針沒有任何的關系
  • 引用是變量的新名字,操作引用就是操作對應的變量

從 C++ 編譯器的角度來看

  • 為了支持新概念“引用”必須要一個有效的解決方案
  • 在編譯器內部,使用指針常量來實現“引用”
  • 因此“引用”在定義時必須初始化

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

  • 當進行 C++ 編程時,直接站在使用的角度看待引用,與指針毫無關系,引用就是變量的別名
  • 當對 C++ 代碼進行調試分析時,一些特殊情況,可以考慮站在C++編譯器的角度看待引用

下面看一段引用典型問題分析:

#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;
}

下面為輸出結果:

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

三、小結

  • 指針是一個變量
  • 引用是一個變量的新名字
  • const 引用能夠生成新的只讀變量
  • 在編譯器內部使用指針常量實現“引用”
  • 編譯時不能直接確定初始值的 const 標識符都是只讀變量

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

相關文章

  • C++ ReSharper2021激活碼永久有效

    C++ ReSharper2021激活碼永久有效

    ReSharperC++是為c/c++開發(fā)者打造的一款實用Visual Studio擴展插件,這款插件旨在提升開發(fā)者的效率,今天給大家分享這款軟件的激活方法,需要C++ ReSharper2021激活碼的朋友參考下本文
    2021-06-06
  • 一篇文章弄懂C++左值引用和右值引用

    一篇文章弄懂C++左值引用和右值引用

    左值(lvalue)和右值(rvalue)是 c/c++ 中一個比較晦澀基礎的概念,這篇文章主要給大家介紹了關于如何通過一篇文章弄懂C++左值引用和右值引用的相關資料,需要的朋友可以參考下
    2021-07-07
  • 詳解C++虛函數表存儲位置

    詳解C++虛函數表存儲位置

    相信大家知道虛表指針和虛函數存儲的位置,但對于虛函數表的存儲位置一時無法確定。本文就來和大家詳細聊聊相關內容,希望對大家有所幫助
    2023-04-04
  • c++中關于max_element()函數解讀

    c++中關于max_element()函數解讀

    這篇文章主要介紹了c++中關于max_element()函數解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 一起來學習C++的動態(tài)內存管理

    一起來學習C++的動態(tài)內存管理

    這篇文章主要為大家詳細介紹了C++的動態(tài)內存管理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++多線程中互斥量的使用詳解

    C++多線程中互斥量的使用詳解

    這篇文章主要介紹了C++多線程中互斥量的使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • 對C語言中sizeof細節(jié)的三點分析介紹

    對C語言中sizeof細節(jié)的三點分析介紹

    以下是對C語言中sizeof的細節(jié)進行了詳細的分析介紹,需要的朋友可以參考下
    2013-07-07
  • iostream與iostream.h的區(qū)別詳細解析

    iostream與iostream.h的區(qū)別詳細解析

    以下是對C++中iostream與iostream.h的區(qū)別進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • C++ OpenCV實現抖音"藍線挑戰(zhàn)"特效

    C++ OpenCV實現抖音"藍線挑戰(zhàn)"特效

    這篇文章主要介紹了如何使用OpenCV C++ 實現抖音上的特效“藍線挑戰(zhàn)”。文中的示例代碼講解詳細,對我們學習OpenCV有一定的幫助,需要的可以參考一下
    2022-01-01
  • C語言 函數指針(指向函數的指針)詳解

    C語言 函數指針(指向函數的指針)詳解

    本文主要介紹 C語言函數指針的知識,這里整理了詳細的資料及示例代碼以便大家學習參考,有需要學習此部分知識的朋友可以參考下
    2016-08-08

最新評論