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

C++ const限定符以及頂層const和底層const的案例詳解

 更新時(shí)間:2021年09月10日 16:01:56   作者:Chancer224  
這篇文章主要介紹了C++ const限定符以及頂層const和底層const的案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

一、const限定符的作用

  當(dāng)我們?cè)趯懗绦虻臅r(shí)候,想定義一種變量,它的值不會(huì)被改變,這時(shí)就可以用const限定符來定義變量,也可稱它為常量,常量的定義必須要有初始值,否則編譯錯(cuò)誤。其實(shí)際例子是用一個(gè)變量來表示緩沖區(qū)的大小的時(shí)候。

  對(duì)內(nèi)置類型用const是比較通俗易懂的,其作用就是不能對(duì)用const定義了的變量進(jìn)行修改(寫),但可以進(jìn)行拷貝(讀)。

const int bufSize = 512;    //正確
const int bufSize2;    //錯(cuò)誤,const對(duì)象必須要初始化    
int buffer[bufSize];
 
const int a = 1;
int b = 2;
a = 3;    //錯(cuò)誤,不能對(duì)常量進(jìn)行賦值    
b = a;    //正確

二、const和引用

  在我的理解中,引用就相當(dāng)于一個(gè)常量,它在初始化時(shí)就已經(jīng)與一個(gè)對(duì)象綁定在一起,之后就不能綁定其他對(duì)象,這種專一的品質(zhì)非常值得我們學(xué)習(xí)。而當(dāng)用const對(duì)引用進(jìn)行定義時(shí),它的作用就是說明該引用綁定的對(duì)象是一個(gè)常量,不能對(duì)該引用進(jìn)行修改(事實(shí)上,常量引用綁定的對(duì)象不一定是常量,常量引用中的“常量”這兩個(gè)字的意思其實(shí)是引用覺得其綁定的對(duì)象是一個(gè)常量,但該綁定的對(duì)象是變量也是合法的,下面通過代碼詳細(xì)說明)。

//非常量引用
int a = 0;
int &r = a;
r = 1;    //通過操作引用來對(duì)a賦值,此時(shí)相當(dāng)于a=1
 
//常量引用綁定常量
const int b = 1;    //b是一個(gè)常量
const int &r2 = b;    //正確
r2 = 5;      //錯(cuò)誤,不能對(duì)常量引用進(jìn)行修改
b = 5;    //錯(cuò)誤
 
//常量引用綁定變量
int c = 1;
const int &r3 = c;    //正確,常量引用也可以綁定變量
r3 = 5;    //錯(cuò)誤,不可修改常量引用
int d = r3;    //正確,常量引用可讀,該值為c
c = 5;    //正確,可修改變量
 
//非常量引用不可綁定常量
const int e = 1;
int &r4 = e;    //錯(cuò)誤

  以上四種情況已說明const和引用的關(guān)系,為何第四種情況中不可用非常量引用綁定常量呢,這是因?yàn)槲覀円呀?jīng)定義了e是一個(gè)不可修改的常量,假如我們用非常量引用成功綁定了它,并且可以通過修改引用來使e的值改變,這不就違背了e作為常量其值不可改變的理念了嗎,所以第四種情況編譯器是會(huì)報(bào)錯(cuò)的。

  常量引用中的const的作用是針對(duì)引用綁定的對(duì)象的,指所綁定的對(duì)象是一個(gè)常量,這叫做底層const。

三、const和指針

  引用不是一個(gè)對(duì)象,因此const不能針對(duì)引用起作用,只能對(duì)引用的綁定對(duì)象起作用。但指針是一個(gè)對(duì)象,所以指針和const之間有三種組合方式:1.常量指針,2.指向常量的指針,3.指向常量的常量指針,其三者作用如下代碼所示。

//1、常量指針
//常量指針指向變量,即常量指針中的地址不能修改
int a = 1;
int b = 2;
int *const p = &a;    //正確,常量指針可以指向變量
p = &b;    //錯(cuò)誤,常量指針中的地址值不能修改
*p = 2;    //正確,p的解引用是a的值,a是變量,可以修改該值
 
//2、指向常量的指針
//即指針中的地址可以修改,但指向的對(duì)象是常量不能用解引用修改值(實(shí)際上指向的對(duì)象可以是變量)
int c = 3;
const int d = 4;
int e = 5;
const int f = 6;
int const *p2 = &c;    //正確,指向常量的指針可以指向變量
const int *p3 = &d;    //正確,指向常量的指針指向常量
p2 = &e;    //正確,可以改變指向的地址
p3 = &f;     //正確
*p2 = 0;    //錯(cuò)誤,雖然p2實(shí)際指向的是一個(gè)變量,但操作p2的解引用時(shí)p2把指向的對(duì)象看作常量,因此不能通過解引用來修改對(duì)象的值
c = 0;    //正確,不能通過p2的解引用修改c,但c自身是變量可以修改
*p3 = 0;    //錯(cuò)誤,同理p2
f = 0;    //錯(cuò)誤
 
//3、指向常量的常量指針
//即指針中的地址不可以修改,指向的對(duì)象是常量也不能用解引用修改值(實(shí)際上指向的對(duì)象可以是變量)
int g = 1;
const int h = 2;
const int *const p4 = &g;    //正確
const int *const p5 = &h;    //正確
p4 = &h;    //錯(cuò)誤,不能修改值
*p4 = 0;    //錯(cuò)誤,不能修改其解引用

  對(duì)象的類型確定了對(duì)象的操作,因此指向常量的指針?biāo)摹俺A俊眱勺植皇窍拗浦羔樦赶虻膶?duì)象必須是常量,而是限制了指針的解引用操作。因?yàn)橹赶虺A康闹羔樅统A恳靡粯樱且粋€(gè)自以為是的家伙,它認(rèn)為自己指向的一定是一個(gè)常量,所以對(duì)指向常量的指針進(jìn)行解引用,讓指針認(rèn)為在對(duì)一個(gè)常量進(jìn)行修改,因此這是非法的行為。

四、頂層const和底層const

1、頂層const

  何為頂層const,其定義為對(duì)象本身是一個(gè)常量,因此對(duì)一切的內(nèi)置類型常量而言,所有的const都是頂層const,而對(duì)于指針而言,常量指針是頂層const,對(duì)于引用則沒有頂層const的概念,以下代碼都是頂層const。

const int a = 1;
const double val = 3.14;
const string str = “hello”;
int *const p = &a;

  頂層const的對(duì)象一旦完成初始化,就不能修改其值,但可以作為被拷貝對(duì)象進(jìn)行拷貝操作,如下代碼所示。

const int b = 1;
b = 2;    //錯(cuò)誤,頂層const不能修改值
int c = b;    //正確,頂層const可以被拷貝
int *const p2 = &b;
*p2 = 0;    //錯(cuò)誤,實(shí)際指向的為常量,不能修改其解引用
p2 = &c;    //錯(cuò)誤,頂層const不能修改值
 
int *const p3 = &c;
*p3 = 3;    //正確,實(shí)際指向的為變量,可以修改其解引用
 
const int *p4 = p2;    //正確,頂層const可以被拷貝
*p4 = 0;    //錯(cuò)誤,p4是底層const(下面解釋),不能修改其解引用

  有些朋友可能對(duì)const int *p3這句定義語(yǔ)句有疑問,其實(shí)它和int const *p3是一樣的,都是指向常量的指針,也是一個(gè)底層const(下面介紹),而以上代碼說明頂層const對(duì)象不能修改,但可以被拷貝,因?yàn)楸豢截惖倪^程中,是可以忽略頂層const的。

2、底層const

  底層const這個(gè)概念只在指針和引用上有效,其定義是該指針指向或該引用綁定的對(duì)象是常量。因此指針可以有頂層const和底層const,而引用只有底層const。

int a = 0;
int const *p = &a;    //底層const
const int &r = a;    //底層const

  很多朋友可能分不清一個(gè)指針到底是底層const還是頂層const,這里可以教大家一個(gè)方法,就是看變量名最近的聲明符是什么,例如const int *p,最近的聲明符是*,因此他是一個(gè)指針,第二個(gè)聲明符才是const,因此他是一個(gè)指向常量的指針;又例如int *const p2,最近的聲明符是const,因此p2是一個(gè)常量,第二個(gè)聲明符才是*,因此它是一個(gè)常量指針。其實(shí)大家只要記住一個(gè)就行,各人有各人的方法,最緊要自己覺得好用啦。

  了解了底層const,那么我們分析一下底層const可以進(jìn)行哪些操作,以下為代碼。

int a = 0;
const int b = 0;
int const *p = &a;    //底層const可以指向常量也可以指向變量,因?yàn)閷?duì)于&a該類型可以從int*轉(zhuǎn)換為const int*,因此可以說成對(duì)象被拷貝時(shí)可以忽略其頂層const
 
//對(duì)于引用的底層const,即是常量引用
const int &r = a;    //綁定一個(gè)變量
r = 0;    //錯(cuò)誤,引用的底層const不可以修改值。
int c = r;  //正確
const int d = r;    //正確
int &r2 = r;    //錯(cuò)誤
const int r3 = r;    //正確  
 
//對(duì)于指針的底層const,即指向常量的指針
//修改指針的值
p = &b;    //正確,指針的底層const可以修改值
*p = 2;    //錯(cuò)誤,指針的底層const不可以修改解引用的值
 
//指針被拷貝
int *p2 = p;    //錯(cuò)誤
int *const p3 = p;    //錯(cuò)誤
int const *p4 = p;    //正確
const int *const p5 = p;    //正確,p5有頂層和底層const 

  對(duì)于引用的底層const,因?yàn)橐脹]有頂層const,對(duì)于它的操作特性,可以從它綁定了一個(gè)常量這個(gè)基礎(chǔ)去理解,實(shí)際它不一定綁定常量,但在使用常量引用時(shí)要看成他始終綁定了一個(gè)常量,那么它的修改和被拷貝是否允許就比較清楚了。

  對(duì)于指針的底層const,指針把自己指向的對(duì)象視為常量,所以我們修改解引用的值時(shí)相當(dāng)于修改指向的那個(gè)常量對(duì)象的值,這是不允許的,所以編譯器報(bào)錯(cuò)。但指針不是常量指針(沒有頂層const),因此可以修改指針的值(指向的對(duì)象可以改變)。當(dāng)有底層const的指針用作被拷貝的對(duì)象是,其底層const就不能忽略了,拷入和拷出的對(duì)象必須都要有底層const才能對(duì)底層const指針進(jìn)行拷貝操作。

對(duì)指針const限定符的總結(jié):

  1. 頂層const不能修改值,但其解引用可能可以修改(根據(jù)實(shí)際指向的對(duì)象決定)
  2. 頂層const作為被拷貝值時(shí),沒有限制,可以被忽略
  3. 底層const可以修改值,但其解引用不能修改
  4. 底層const在用作拷貝操作時(shí),要求拷入與拷出值都有相同的底層const(都是底層const,或都不是),不能忽略。

到此這篇關(guān)于C++ const限定符以及頂層const和底層const的案例詳解的文章就介紹到這了,更多相關(guān)C++ const限定符以及頂層const和底層const內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • QT與MATLAB混合編程的詳細(xì)教程

    QT與MATLAB混合編程的詳細(xì)教程

    最近項(xiàng)目需要,matlab的一些算法需要工程用,因此需要直接轉(zhuǎn)成Qt能夠調(diào)用的形式,下面這篇文章主要給大家介紹了關(guān)于QT與MATLAB混合編程的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • 使用鉤子如何鎖定鍵盤的方法分享

    使用鉤子如何鎖定鍵盤的方法分享

    鎖鍵盤一般用鉤子實(shí)現(xiàn),所以難度稍大,不過下面這個(gè)程序當(dāng)簡(jiǎn)單,而且連鉤子所需要DLL也省了
    2014-01-01
  • C++ 之explicit關(guān)鍵字

    C++ 之explicit關(guān)鍵字

    今天我們來談?wù)凜++中的explicit關(guān)鍵字,這篇文章詳細(xì)介紹了C語(yǔ)言的關(guān)鍵字explicit關(guān)鍵字,本文有詳細(xì)的代碼實(shí)例,感興趣的同學(xué)可以借鑒參考
    2023-04-04
  • c++ typeid關(guān)鍵字的使用

    c++ typeid關(guān)鍵字的使用

    這篇文章主要介紹了c++ typeid關(guān)鍵字的使用,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2020-11-11
  • opengl實(shí)現(xiàn)任意兩點(diǎn)間畫圓柱體

    opengl實(shí)現(xiàn)任意兩點(diǎn)間畫圓柱體

    這篇文章主要為大家詳細(xì)介紹了opengl實(shí)現(xiàn)任意兩點(diǎn)間畫圓柱體,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 淺談單調(diào)隊(duì)列、單調(diào)棧

    淺談單調(diào)隊(duì)列、單調(diào)棧

    其實(shí),單調(diào)隊(duì)列和單調(diào)棧是類似的,在我看來,這兩個(gè)東西只是名字不一樣 - - ! 比較容易想的一道題啦! 首先,這題的兩個(gè)關(guān)鍵點(diǎn): 1、區(qū)間的和。這個(gè)簡(jiǎn)單,地球人都知道! 2、區(qū)間的最小值。
    2015-07-07
  • C語(yǔ)言實(shí)現(xiàn)萬年歷程序

    C語(yǔ)言實(shí)現(xiàn)萬年歷程序

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)萬年歷程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 基于Matlab實(shí)現(xiàn)嗅覺優(yōu)化算法的示例代碼

    基于Matlab實(shí)現(xiàn)嗅覺優(yōu)化算法的示例代碼

    嗅覺劑優(yōu)化是一種新穎的優(yōu)化算法,旨在模仿氣味分子源尾隨的藥劑的智能行為。本文將利用Matlab實(shí)現(xiàn)這一智能優(yōu)化算法,需要的可以參考一下
    2022-05-05
  • 如何用C++實(shí)現(xiàn)雙向循環(huán)鏈表

    如何用C++實(shí)現(xiàn)雙向循環(huán)鏈表

    本篇文章是對(duì)用C++實(shí)現(xiàn)雙向循環(huán)鏈表的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Qt5.14.2使用虛擬鍵盤的關(guān)鍵代碼

    Qt5.14.2使用虛擬鍵盤的關(guān)鍵代碼

    對(duì)于Qwidget程序,使用qtvirtualkeyboard彈出鍵盤之后,鍵盤會(huì)浮于表面。使用VirtualkeyboardPushView模塊,自動(dòng)根據(jù)情況把輸入視圖往上面推移,這篇文章主要介紹了Qt5.14.2使用虛擬鍵盤的關(guān)鍵代碼,需要的朋友可以參考下
    2022-09-09

最新評(píng)論