C++中const關(guān)鍵字的用法圖文詳解
C語言和C++中const的不同
首先我們需要區(qū)分一下C語言中的const和C++中的const,C語言中的const修飾的變量可以不初始化,但如果將一個(gè)變量定位為const類型還不初始化,那么之后就不能對這個(gè)變量直接賦值了。
如果我們使用C語言中的const定義的變量指定數(shù)組的大小,那么就會直接報(bào)錯(cuò),因?yàn)閿?shù)組大小的初始化必須是一個(gè)常量,實(shí)際上在C語言中,const確實(shí)不是用來定義一個(gè)常量的,而是用來定義一個(gè)常變量的,只是這個(gè)變量的值不能被直接修改(通過指針還是可以修改這塊內(nèi)存的值的),除此之外這個(gè)變量和其他的C語言的變量沒什么區(qū)別,甚至連編譯生成指令的方式都是一樣的。
但是在C++中,const就是真正用來定義一個(gè)常量的,不進(jìn)行初始化就會直接報(bào)錯(cuò)。
這主要是因?yàn)槌A康木幾g方式和變量的編譯方式不同,常量在編譯階段會將整個(gè)程序中這個(gè)常量的名稱都替換為這個(gè)常量的值,那么如果你在定義一個(gè)常量的時(shí)候,還不進(jìn)行初始化的話,編譯器就不知道要替換為什么值,自然就會直接報(bào)錯(cuò)了。
用C++中的const修飾的變量可以初始化數(shù)組的大小,也說明了這個(gè)變量實(shí)際上是一個(gè)常量。
當(dāng)然了既然已經(jīng)用const修飾作為常量了,那么這個(gè)變量就不能作為左值來使用了,畢竟你不能修改一個(gè)常量的值嘛。
如果你按照下面這種方式在C++中定義一個(gè)const類型的變量,那么這個(gè)變量就直接退化為了C語言中的常變量了。
int a = 10; const int p = a; return 0;
C++中的const配合一級指針使用
一般來說,在C++中const配合一級指針使用有四種形式。
const int *p int const* p; int* const p; const int* const p;
const的修飾作用
那么很多人其實(shí)分不清這上面四種const用法所產(chǎn)生的效果,實(shí)際上,在C++中const修飾的是離它最近的類型。
比如const int *p,這個(gè)const顯然修飾的是int類型,也就是*p,p本身是一個(gè)int*類型的,*p就是int類型嘛,代表*p不能被改變。
int const *p,這個(gè)const離int最近,所以也是修飾int類型,同樣是*p,代表*p不能被改變,也就是指針?biāo)赶虻闹挡荒芨淖儭?/p>
int *const p的const就是離int *最近了,所以修飾的是int*類型,也就是p,代表p所指向的地址不能改變。
const int * const p有兩個(gè)const,離第一個(gè)const最近的是int,離第二個(gè)const最近的是int *,所以第一個(gè)const修飾的是*p,代表*p不能改變,第二個(gè)const修飾的是p,代表p不能改變,所以呢,這個(gè)指針?biāo)赶虻闹挡荒鼙恍薷?,指向的地址也不能被修改?/p>
const的類型轉(zhuǎn)換
對于const的類型轉(zhuǎn)換,我們需要知道一個(gè)原則,那就是const的右邊如果沒有指針符號的話,const不參與類型之中。
int* q; int* const p; const int* w;
int *q的類型是int *,int *const p的類型也是int *,因?yàn)閏onst的右邊沒有*號,所以const不參與類型中,而const int *w的類型就是const int*了,因?yàn)閏onst的右邊存在*號。
另外呢,從int *是可以轉(zhuǎn)換到const int *的,但是const int *不能轉(zhuǎn)換為int *,否則不就代表你可以修改這個(gè)指針?biāo)赶虻闹盗藛帷?/p>
到此這篇關(guān)于C++中const關(guān)鍵字用法的文章就介紹到這了,更多相關(guān)C++ const關(guān)鍵字用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++編寫實(shí)現(xiàn)飛機(jī)大戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了C++編寫實(shí)現(xiàn)飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06關(guān)于c++ 智能指針及 循環(huán)引用的問題
下面小編就為大家?guī)硪黄P(guān)于c++ 智能指針及 循環(huán)引用的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01C++編寫LINUX守護(hù)進(jìn)程的實(shí)現(xiàn)代碼
這篇文章主要介紹了如何使用C++實(shí)現(xiàn)LINUX守護(hù)進(jìn)程,文中代碼非常詳細(xì),供大家學(xué)習(xí)參考,感興趣的小伙伴可以了解下2020-06-06深入分析C語言中結(jié)構(gòu)體指針的定義與引用詳解
本篇文章是對C語言中結(jié)構(gòu)體指針的定義與引用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++?解決求兩個(gè)鏈表的第一個(gè)公共結(jié)點(diǎn)問題
本文主要介紹了利用C++實(shí)現(xiàn)輸入兩個(gè)無環(huán)的單向鏈表時(shí),找出它們的第一個(gè)公共結(jié)點(diǎn)的問題。文章中的示例代碼簡潔易懂,感興趣的同學(xué)可以和小編一起學(xué)習(xí)一下2021-12-12C語言實(shí)現(xiàn)循環(huán)隊(duì)列
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)循環(huán)隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07