您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“C++11關(guān)鍵字const怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“C++11關(guān)鍵字const怎么使用”吧!
按理來說,要想了解一件事物提出的原因,最好的辦法就是去尋找當(dāng)時(shí)的歷史背景,以及圍繞這件事所發(fā)生的故事。
可是非常抱歉,我并沒沒有找到C
語言中const
提出的背景,但是一個(gè)可以參考的歷史是,常量這種數(shù)據(jù)形式早在匯編語言中就有所體現(xiàn),匯編語言中的constant
是一個(gè)確定的數(shù)值,在匯編階段就可以確定直接編碼在于指令代碼中,不是保存在寄存器中的可以變化的量。
常量是需求,C
語言沒理由不保留這個(gè)傳統(tǒng),自然而然的const
關(guān)鍵字出現(xiàn)了。
顧名思義,const
最基礎(chǔ)的作用就是保證數(shù)據(jù)不會(huì)被修改,僅僅可讀而已。這就好比一份沒有write
權(quán)限的文件一樣,只能遠(yuǎn)觀而已。
const
是C語言32個(gè)關(guān)鍵字(C++中有49個(gè))中的一個(gè),主要起類型修飾的作用,可以理解為變量的屬性,比方說const int a = 10
從右往左看int a = 10
是定義并初始化了一個(gè)變量a
等于10,隨后使用const 修飾這個(gè)變量,告訴編譯器,這個(gè)變量是不可修改的。為了維護(hù)程序的安全性,由于const
一旦修飾就無法再更改了,那么const int a;
會(huì)生成一個(gè)值隨機(jī)且永遠(yuǎn)無法修改的量,這樣非常不安全,所以C
的編譯器會(huì)要求你必須在定義的時(shí)候就立馬初始化。從這里也可以看出const
關(guān)鍵字的強(qiáng)硬之處。
到底const該放在哪?
在詳細(xì)討論const的用法之前,必須首先明白,const
是C語言中的一個(gè)類型限定符(type quailier
),是類型的一個(gè)部分,且const
越靠近誰,就修飾誰是常量類型。
從C語言的基礎(chǔ)數(shù)據(jù)類型來看,基本上可以抽象為一下幾個(gè)類別
基礎(chǔ)數(shù)據(jù)類型(整型,浮點(diǎn))
對于基礎(chǔ)數(shù)據(jù)類型,使用const就單純定義為一個(gè)不可修改的量,此時(shí)由于不涉及其他的類型限制符,所以
const
放在哪里都是有效的
const int i = 10
\(\Leftrightarrow\)int const i = 10
但是一般const
在前。
指針類型(指針)
相比于基礎(chǔ)數(shù)據(jù)類型,指針類型存在很大的不同。
不使用const
修飾的指針,此時(shí)表示該指針一定指向一個(gè)變量,當(dāng)指向const修飾的變量是就會(huì)報(bào)錯(cuò)
const int a = 10; int * ptr = a; // error
當(dāng)const
放在 int *
前時(shí),表示指針類型是 const int
類型,那么依據(jù)指針類型的定義,該指針必定指向一個(gè)const int
類型的量,即常量。
const int b = 100; const int * a = &b;
當(dāng)const
放在 int *
后面時(shí),int * const a
,顯然根據(jù)常規(guī)的指針類型的定義,我們只能推測出這是一個(gè)指向int
類型的指針,那么const
起什么作用呢?(見如下代碼)
int c = 10, b = 20; const int b = 30; int * const a = &c; // 此處沒有報(bào)錯(cuò),證明*號(hào)前面是指針類型,這條真理沒錯(cuò) //1. 可當(dāng)我們嘗試修改指向的時(shí)候 a = &b; // 此處會(huì)報(bào)錯(cuò)!這表明const靠近變量名的時(shí)候表示指針指向一個(gè)變量后就無法更改了 //2. 如果一開始就不初始化int * const a呢? int * const a; // 此處會(huì)報(bào)錯(cuò) //3. 如果嘗試讓他指向一個(gè)const量呢? int * const a = &b; // 此處會(huì)報(bào)錯(cuò)
以此類推可以得到一個(gè)指向const變量的無法修改指向的指針
const int b = 10; const int * const a = &b;
所以可以給出總結(jié)
const
靠近變量名的時(shí)候表示指針必須指向一個(gè)類型與指針類型相同的變量
一旦指向就無法更改指向
無法指向常量
復(fù)雜數(shù)據(jù)類型(枚舉,結(jié)構(gòu),共用)
針對復(fù)雜類型,由于出現(xiàn)了簡單類型的嵌套,自然會(huì)有const
的嵌套關(guān)系,下面以結(jié)構(gòu)體來舉例子
當(dāng)const
嵌套在結(jié)構(gòu)體內(nèi)部時(shí)。
typedef struct a { const int b; int c; }A; int main() { A aa; aa.b = 10; // 此處會(huì)報(bào)錯(cuò) }
在C語言中,在結(jié)構(gòu)體內(nèi)部使用const修飾不會(huì)報(bào)錯(cuò)的,但是此變量再也無法修改,意味著這是一個(gè)無效量,既無法初始化,也無法修改(但是得益于C++的面向?qū)ο髾C(jī)制,即使如此我們還是可以定義const
并且給他賦值)。
當(dāng)定義結(jié)構(gòu)體的時(shí)候使用const
const A bb;
此時(shí)也會(huì)報(bào)錯(cuò),而且相對來說比上面還嚴(yán)重,此時(shí)結(jié)構(gòu)體內(nèi)部的所有值都是亂的,且無法修改。
而C++中由于引入了幾種新的編程模式,const
的作用范圍又進(jìn)一步被擴(kuò)充。
類中屬性與成員函數(shù)
結(jié)構(gòu)體的遺留問題(即類的常量屬性)
這里先來解決前面C語言中的結(jié)構(gòu)體問題,需求是想在結(jié)構(gòu)體內(nèi)部定義const變量,知道結(jié)構(gòu)體內(nèi)部的變量是無法直接初始化的,而C++中結(jié)構(gòu)體可以理解為類,只不過權(quán)限不同而已,同樣可以擁有構(gòu)造函數(shù)。
那么是不是可以在構(gòu)造函數(shù)中初始化呢?(下面代碼會(huì)報(bào)錯(cuò))
struct a { a() { b = 100; } const int b; };
不是我們想的那樣,不過也非常接近,對于初始化類的變量還有一種方法,使用初始化列表(類的初始化列表的優(yōu)先級是非常高的)
struct a { a() : b(100) {;} const int b; };
或者還有
struct a { const int b = 100; };
利用C++特性直接賦值,而此段代碼在C語言中會(huì)報(bào)錯(cuò),這也是C與C++不同的一個(gè)地方。
如此就完美解決了結(jié)構(gòu)體const
量 問題。
類的靜態(tài)變量vs const
變量
static
也是一個(gè)修飾符,確定的是變量的生存期。const
覺得變量的可讀性,有這樣一條語句在類中和main函數(shù)中存在不同的意義
static const int a; // 此語句在main中會(huì)報(bào)錯(cuò),由于未初始化 // 在類中不會(huì)
這是由于static不會(huì)影響const的表達(dá),在main函數(shù)中說明此變量就是const類型,確實(shí)需要立馬賦值。而在類中可以不那么著急,可以把類中的static變量理解為一個(gè)申明,在類的外面或者里面直接定義都可以,不會(huì)報(bào)錯(cuò)。
函數(shù)const
以及類成員函數(shù)的const
修飾
普通函數(shù)的const
函數(shù)const
首先想到的是const 變量返回值。但是這其實(shí)是沒太大意義的
const
修飾返回值其實(shí)完全沒有發(fā)揮作用,屬于無效修飾。同樣的使用const修飾形式參數(shù)的時(shí)候也是如此,并不會(huì)限定你傳入的是const
還是普通變量,本質(zhì)在于這一過程發(fā)生原因是由于值傳遞,不論是返回const
還是使用const
修飾形式參數(shù),內(nèi)部都發(fā)生了變量的創(chuàng)建與賦值
那const
修飾形參的例子,
int fun(const int a) { // a = 10 會(huì)報(bào)錯(cuò) return a } int main() { int c = 10; int d = fun(c); // 不會(huì)報(bào)錯(cuò) }
如上,c傳入的時(shí)候是把c的值拿到,然后函數(shù)壓棧,創(chuàng)建一個(gè)const int
變量a
且立馬初始化為c
的值,如此就在函數(shù)內(nèi)部生成了一個(gè)const
變量。跟傳入什么值完全沒有關(guān)系。
成員函數(shù)的const
尾修飾
這屬于C++的特性,成員函數(shù)尾巴加上一個(gè)const
限制此函數(shù)對對象的修改,且提高了代碼的可讀性。
class A { private: int a; public: static int B; int getA() const { A::B = 100; // 此處不會(huì)報(bào)錯(cuò) a = 100; // 這里會(huì)報(bào)錯(cuò) return a; } }; int A::B = 100;
使用const
修飾成員函數(shù)會(huì)使該函數(shù)變成const member function
此類型無法修改對象的數(shù)據(jù),但是可以修改可修改的靜態(tài)變量。
引用
引用相對來說沒有指針那么多的變種,引用的const
修飾也僅僅局限于讓引用變量無法修改指向這一點(diǎn)上。
在補(bǔ)充一點(diǎn)
const修飾類靜態(tài)整型變量的時(shí)候可以在類內(nèi)部直接初始化(浮點(diǎn)數(shù)仍然是不行的)。
到此,相信大家對“C++11關(guān)鍵字const怎么使用”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。