chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

3天內(nèi)不再提示

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

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2020-12-24 15:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

一、const關鍵字的總結(jié)

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

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

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

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

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

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

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

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

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

代碼版本一:

#include <stdio.h>
int main()

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

輸出結(jié)果:

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;

輸出結(jié)果:

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;

輸出結(jié)果:

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 類型默認轉(zhuǎn)換為 int;const 引用初始化類型不同,將得到新的只讀變量,所以改變 rc 和 trc 沒有絲毫關系,從我們的輸出結(jié)果可以看出來
rc = 'a';
printf("c = %c",c);
printf("rc = %c",rc);
printf("trc = %c",trc);
return 0;

結(jié)果輸出:

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

二、引用的總結(jié):

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

(1)指針是一個常量:

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

通過指針可以訪問對應內(nèi)存地址中的值

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

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

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

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

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

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

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

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

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

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

在編譯器內(nèi)部,使用指針常量來實現(xiàn)"引用"

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

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

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

當對C++代碼進行調(diào)試分析時,一些特殊情況,可以考慮站在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;

輸出結(jié)果:

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};//數(shù)組中的每個元素是引用就不可以;error: declaration of ‘a(chǎn)rray’ as array of references;C++ 天生要支持 C 語言,C 語言中數(shù)組中的每個元素在內(nèi)存中是順序存放的,地址是遞增的,所以在 C++ 中也要兼容這個特性,而在 C++ 中唯有引用數(shù)組破快了這個特性,所以說 C++ 中不支持引用數(shù)組;&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;

輸出結(jié)果:

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

三、總結(jié):

指針是一個變量

引用是一個變量的新名字

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

在編譯器內(nèi)部使用指針常量實現(xiàn)"引用"

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

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

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

    關注

    7

    文章

    526

    瀏覽量

    45384
  • C++
    C++
    +關注

    關注

    22

    文章

    2123

    瀏覽量

    77049
  • CONST
    +關注

    關注

    0

    文章

    45

    瀏覽量

    8743
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    keil實現(xiàn)cc++混合編程

    起因項目中使用到一個開源的模擬IIC的庫,封裝的比較好,但是是使用c++寫的。于是將其移植到自己的項目中,主要有以下三步操作: 在工程選項 C/C++中去掉勾選
    發(fā)表于 01-26 08:58

    C語言與C++的區(qū)別及聯(lián)系

    缺點:性能比面向過程低。 二、具體語言上的區(qū)別 1、關鍵字的不同 C語言有32個關鍵字;C++有63個關鍵字。 2、后綴名不同 C源文件后綴.c
    發(fā)表于 12-24 07:23

    CC++之間的聯(lián)系

    1、語法兼容性: C++完全兼容C語言的語法,這意味著任何有效的C語言程序都可以直接在C++編譯器下編譯通過。 2、底層控制: C++
    發(fā)表于 12-11 06:51

    C語言和C++之間的區(qū)別是什么

    C++的標準庫那樣集成度高和功能齊全。 6、編譯器與語言特性: C++編譯器通常比C語言編譯器更加復雜,因為它需要處理更多的語言特性,比如模板元編程、命名空間、引用等。
    發(fā)表于 12-11 06:23

    C/C++條件編譯

    條件編譯是一種在編譯時根據(jù)條件選擇性地包含或排除部分代碼的處理方法。在 C/C++ ,條件編譯使用預處理指令 #ifdef、#endif、#else 和 #elif 來實現(xiàn)。常用的條件編譯指令有
    發(fā)表于 12-05 06:21

    C++程序異常的處理機制

    1、什么是異常處理? 有經(jīng)驗的朋友應該知道,在正常的CC++編程過程難免會碰到程序不按照原本設計運行的情況。 最常見的有除法分母為零,數(shù)組越界,內(nèi)存分配失效、打開相應文件失敗等等。 一個程序
    發(fā)表于 12-02 07:12

    C/C++代碼靜態(tài)測試工具Perforce QAC 2025.3的新特性

    ?Perforce Validate??QAC?項目的相對/根路徑的支持。C++?分析也得到了增強,增加了用于檢測 C++?并發(fā)問題的新檢查,并改進了實體名稱和實
    的頭像 發(fā)表于 10-13 18:11 ?549次閱讀
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>代碼靜態(tài)測試工具Perforce QAC 2025.3的新特性

    技能+1!如何在樹莓派上使用C++控制GPIO?

    和PiGPIO等庫,C++可用于編程控制樹莓派的GPIO引腳。它提供了更好的性能和控制能力,非常適合對速度和精度要求較高的硬件項目。在樹莓派社區(qū),關于“Python
    的頭像 發(fā)表于 08-06 15:33 ?4054次閱讀
    技能+1!如何在樹莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    請問如何在C++中使用NPU上的模型緩存?

    無法確定如何在 C++ 的 NPU 上使用模型緩存
    發(fā)表于 06-24 07:25

    在OpenVINO? C++代碼啟用 AddressSanitizer 時的內(nèi)存泄漏怎么解決?

    在 OpenVINO? C++代碼啟用 AddressSanitizer 時遇到內(nèi)存泄漏: \"#0 0xaaaab8558370 in operator new(unsigned
    發(fā)表于 06-23 07:16

    主流的 MCU 開發(fā)語言為什么是 C 而不是 C++

    在單片機的地界兒里,C語言穩(wěn)坐中軍帳,C++想分杯羹?難嘍。咱電子工程師天天跟那針尖大的內(nèi)存空間較勁,C++那些花里胡哨的玩意兒,在這兒真玩不轉(zhuǎn)。先說內(nèi)存這道坎兒。您當stm32f4的256kRAM
    的頭像 發(fā)表于 05-21 10:33 ?1017次閱讀
    主流的 MCU 開發(fā)語言為什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?

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

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

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

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

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

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

    為什么無法在運行時C++推理讀取OpenVINO?模型?

    使用模型優(yōu)化器 2021.1 版OpenVINO?轉(zhuǎn)換模型 使用 Runtime 2022.3 版本在 C++ 推理實現(xiàn) ( core.read_model()) 讀取模型OpenVINO?并
    發(fā)表于 03-05 06:17