在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

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

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2020-12-24 15:35 ? 次閱讀

今天給大家分享一下這段時間學習c++的總結學習:c++里面的const關鍵字和引用。

一、const關鍵字的總結

1、const什么時候為只讀變量,什么時候又是常量呢?

(1)const常量的判別規則:

只用字面量初始化的const常量才會進入符號表

使用其它變量初始化的const常量仍然是只讀變量

被volatile修飾的const常量不會進入符號表

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

(2)const引用的類型與初始化變量的類型

相同:初始化變量成為只讀變量

不同:生成一個新的只讀變量

代碼版本一:

#include <stdio.h>
int main()

const int x = 1;//直接得到值,進入符號表,但是還是會為 x 分配空間,只不過這個空間 x 沒有用而已
const int& rx = x;//rx代表只讀變量,這個變量是編譯器為x分配而沒有使用的空間;引用代表變量的別名,而變量代表一段內存空間的別名,所以引用代表一段內存空間的別名
int& nrx = const_cast<int&>(rx); //消除 rx只讀屬性,和rx 代表的內存空間相同,同時c++里面的幾種類型轉換要掌握
nrx=5;
printf("x = %d",x);
printf("rx = %d",rx);
printf("nrx = %d",nrx);
printf("&x = %p",&x);
printf("&rx = %p",&rx);
printf("&nrx = %p",&nrx);

return 0;

輸出結果:

root@txp-virtual-machine:/home/txp# ./a.out
x = 1
rx = 5
nrx = 5
&x = 0x7ffcc5fa8abc
&rx = 0x7ffcc5fa8abc
&nrx = 0x7ffcc5fa8abc

代碼版本二:

#include <stdio.h>
int main()

volatile const int y = 2;// 只讀變量,不會進入符號表
int *p = const_cast<int*>(&y);//y被 const修飾,取到的地址也有 const 屬性,這里將地址只讀屬性去掉
*p = 8;
printf("y = %d",y);
printf("p = %p",p);
return 0;

輸出結果:

root@txp-virtual-machine:/home/txp# ./a.out
y = 8
p = 0x7ffd78559684

代碼版本三:

#include <stdio.h>
int main()

volatile const int y = 2;
int *p = const_cast<int*>(&y);
*p = 8;
printf("y = %d",y);
printf("p = %p",p);
const int z = y ;//只讀變量
p = const_cast<int*>(&z);
*p= 9;
printf("z = %d",z);
printf("p = %p",p);
return 0;

輸出結果:

root@txp-virtual-machine:/home/txp# ./a.out
y = 8
p = 0x7ffc5d651250
z = 9
p = 0x7ffc5d651254

代碼版本四:

#include <stdio.h>
int main()

char c = 'c';
char& rc = c;
const int& trc = c; // char 類型默認轉換為 int;const 引用初始化類型不同,將得到新的只讀變量,所以改變 rc 和 trc 沒有絲毫關系,從我們的輸出結果可以看出來
rc = 'a';
printf("c = %c",c);
printf("rc = %c",rc);
printf("trc = %c",trc);
return 0;

結果輸出:

root@txp-virtual-machine:/home/txp# ./a.out
c = a
rc = a
trc = c

二、引用的總結:

1、引用與指針有什么關系,以及如何理解"引用的本質就是指針常量"?

(1)指針是一個常量:

值為一個內存地址,不需要初始化,可以保存不同的地址

通過指針可以訪問對應內存地址中的值

指針可以被const修飾成為常量或者只讀變量

(2)引用只是一個變量的新名字:

對引用的操作(賦值、取地址等)都會傳遞到代表的變量上

const引用使其代表的變量具有只讀屬性

引用必須在定義時初始化,之后無法代表其它變量

(3)從使用c++語言的角度來看:

引用與指針沒有任何的關系

引用是變量的新名字,操作引用就是操作對應的變量

(4)從c++編譯器的角度來看:

為了支持新概念"引用"必須要一個有效的解決方案

在編譯器內部,使用指針常量來實現"引用"

因此"引用"在定義時必須初始化

(5)在工程項目開發中:

當進行c++編程時,直接站在使用的角度來看待引用,與指針毫無關系,引用就是變量的別名

當對C++代碼進行調試分析時,一些特殊情況,可以考慮站在C++編譯器的角度來看待引用

代碼實踐:

版本一:

#include <stdio.h>
int a = 2;
struct SV{
int& x;
int& y;
int& z;
};
int main()

int b =4;
int* pc = new int(3) ;
SV sv = {a,b,*pc};
printf("&sv.x = %p",&sv.x);
printf("&sv.y = %p",&sv.y);
printf("&sv.z = %p",&sv.z);
delete pc;
return 0;

輸出結果:

root@txp-virtual-machine:/home/txp# ./a.out
&sv.x = 0x601050
&sv.y = 0x7ffee11ba794
&sv.z = 0x1cfd010

版本二:

#include <stdio.h>
int a = 2;
struct SV{
int& x;
int& y;
int& z;
};
int main()

int b =4;
int* pc = new int(3) ;
SV sv = {a,b,*pc};
int& array[] = {a,b,*pc};//數組中的每個元素是引用就不可以;error: declaration of ‘array’ as array of references;C++ 天生要支持 C 語言,C 語言中數組中的每個元素在內存中是順序存放的,地址是遞增的,所以在 C++ 中也要兼容這個特性,而在 C++ 中唯有引用數組破快了這個特性,所以說 C++ 中不支持引用數組;&array[1] - &array[0] != Expected ==> 4
printf("&sv.x = %p",&sv.x);
printf("&sv.y = %p",&sv.y);
printf("&sv.z = %p",&sv.z);
delete pc;
return 0;

輸出結果:

root@txp-virtual-machine:/home/txp# g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:16:14: error: declaration of ‘array’ as array of references
int& array[] = {a,b,*pc};

三、總結:

指針是一個變量

引用是一個變量的新名字

const引用能夠生成新的只讀變量

在編譯器內部使用指針常量實現"引用"

編譯時不能直接確定初始值的const標識符都是只讀變量

好了,今天的分享就到這里,如果文章中有錯誤或者不理解的地方,可以交流互動,一起進步。我是txp,下期見!

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

    關注

    7

    文章

    523

    瀏覽量

    44500
  • C++
    C++
    +關注

    關注

    22

    文章

    2116

    瀏覽量

    74589
  • CONST
    +關注

    關注

    0

    文章

    45

    瀏覽量

    8345
收藏 人收藏

    評論

    相關推薦

    帶你在單片機編程熟練使用const(可下載)

    C 語言關鍵字 const 舉足輕重,我們今天就深度聊一聊 const 的定義和實際應用,讓它 不再是迷C 語言中
    發表于 04-01 14:18 ?0次下載

    C++學到什么程度可以找工作?

    C++學到什么程度可以找工作?要使用C++找到工作,特別是作為軟件開發人員或相關職位,通常需要掌握以下幾個方面: 1. **語言基礎**:你需要對C++的核心概念有扎實的理解,包括但不限于指針、內存
    發表于 03-13 10:19

    創建了用于OpenVINO?推理的自定義C++和Python代碼,從C++代碼獲得的結果與Python代碼不同是為什么?

    創建了用于OpenVINO?推理的自定義 C++ 和 Python* 代碼。 在兩個推理過程中使用相同的圖像和模型。 從 C++ 代碼獲得的結果與 Python* 代碼不同。
    發表于 03-06 06:22

    Spire.XLS for C++組件說明

    Spire.XLS for C++ 是一款專業的 C++ Excel 組件,可以用在各種 C++ 框架和應用程序。Spire.XLS for C+
    的頭像 發表于 01-14 09:40 ?460次閱讀
    Spire.XLS for <b class='flag-5'>C++</b>組件說明

    EE-112:模擬C++的類實現

    電子發燒友網站提供《EE-112:模擬C++的類實現.pdf》資料免費下載
    發表于 01-03 15:15 ?0次下載
    EE-112:模擬<b class='flag-5'>C++</b><b class='flag-5'>中</b>的類實現

    C語言和C++結構體的區別

    同樣是結構體,看看在C語言和C++中有什么區別?
    的頭像 發表于 10-30 15:11 ?586次閱讀

    C7000優化C/C++編譯器

    電子發燒友網站提供《C7000優化C/C++編譯器.pdf》資料免費下載
    發表于 10-30 09:45 ?0次下載
    <b class='flag-5'>C</b>7000優化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器

    使用OpenVINO GenAI API在C++構建AI應用程序

    許多桌面應用程序是使用 C++ 開發的,而將生成式AI(GenAI)功能集成到這些應用程序可能會很具有挑戰性,尤其是因為使用像 Hugging Face 這樣的 Python 庫的復雜性。C++
    的頭像 發表于 10-12 09:36 ?877次閱讀
    使用OpenVINO GenAI API在<b class='flag-5'>C++</b><b class='flag-5'>中</b>構建AI應用程序

    ostream在c++的用法

    ostream 是 C++ 標準庫中一個非常重要的類,它位于 頭文件(實際上,更常見的是通過包含 頭文件來間接包含 ,因為 包含了 和 )。 ostream 類及其派生類(如 std::cout
    的頭像 發表于 09-20 15:11 ?1502次閱讀

    基于OpenHarmony標準系統的C++公共基礎類庫案例:ThreadPoll

    、線程增強及線程池等接口 安全數據容器、數據序列化等接口 各子系統的錯誤碼相關定義 2.1、添加C++公共基礎類庫依賴 修改需調用模塊的BUILD.gn,在external_deps或deps添加
    發表于 08-12 11:42

    OpenVINO2024 C++推理使用技巧

    很多人都使用OpenVINO新版的C++ 或者Python的SDK,都覺得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的優化與整理,已經是非常貼近開發的使用習慣與推理方式。與OpenCV的Mat對象對接方式更是幾乎無縫對接,非常的方便好用。
    的頭像 發表于 07-26 09:20 ?1364次閱讀

    ModusToolbox 3.2在c代碼包含c++代碼的正確步驟是什么?

    使用 ModusToolbox 3.2 我有一個用純 C 語言編寫的 XMC4700 項目。 我正在嘗試添加一些 C++ 函數,并將其合并到我的原始代碼。 我可以構建獨立的 .cpp/.hpp
    發表于 07-23 08:21

    C++語言基礎知識

    電子發燒友網站提供《C++語言基礎知識.pdf》資料免費下載
    發表于 07-19 10:58 ?8次下載

    C++實現類似instanceof的方法

    函數,可實際上C++沒有。但是別著急,其實C++中有兩種簡單的方法可以實現類似Java的instanceof的功能。 在 C++
    的頭像 發表于 07-18 10:16 ?805次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>中</b>實現類似instanceof的方法

    要用指針怎么引用,一般在file2.c引用file1.c的字符串數組是怎么操作的?

    (RTC_SET,sizeof(RTC_SET));編譯通不過;問題出在sizeof(RTC_SET)討論:要用指針怎么引用,一般在file2.c
    發表于 05-09 08:05
    主站蜘蛛池模板: 日本在线观看永久免费网站 | 国产精选经典三级小泽玛利亚 | 久久精品国产亚洲综合色 | 日本又粗又长一进一出抽搐 | 午夜激情福利视频 | 久草资源网 | 五月开心六月伊人色婷婷 | 日本人xxxxxxxxxⅹ69 | 日韩一级一欧美一级国产 | 免费一级黄色录像 | 色天使色婷婷在线影院亚洲 | 日韩一级在线视频 | 亚洲香蕉网久久综合影院3p | 欧美一级特黄视频 | 一级片视频在线观看 | 午夜欧美 | 天堂资源在线官网 | 免费观看四虎精品成人 | 一区二区三区高清 | 午夜黄色福利 | 天天舔天天干天天操 | 俺要色| 同性男男肉交短文 | 天天爱天天干天天操 | 福利视频一区二区微拍堂 | 香蕉久久夜色精品国产小说 | 黄色网址免费在线 | 五月天婷婷视频在线观看 | 亚洲 欧美 精品 | 中文字幕一区二区三区永久 | 亚洲国产欧美在线成人aaaa | 精品美女在线 | 无遮挡一级毛片 | 欧美激情第一欧美在线 | 日操 | 日日噜噜夜夜狠狠久久丁香 | 天天做天天爱天天爽综合区 | 亚洲综合五月天婷 | 久久精品免费看 | 又粗又大又猛又爽免费视频 | 久青草国产手机在线视频 |