最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++11?關(guān)鍵字?const?使用小結(jié)

 更新時(shí)間:2021年12月11日 11:02:00   作者:MushRain  
const大致意思是“我承諾不改變這個(gè)值”。主要用于說明接口,這樣在把變量傳入函數(shù)時(shí)就不必?fù)?dān)心變量會(huì)在函數(shù)內(nèi)被改變,本文給大家介紹C++11?關(guān)鍵字?const?使用小結(jié),感興趣的朋友一起看看吧

Const 的作用及歷史

const (computer programming) - Wikipedia

一、歷史

按理來說,要想了解一件事物提出的原因,最好的辦法就是去尋找當(dāng)時(shí)的歷史背景,以及圍繞這件事所發(fā)生的故事。

可是非常抱歉,我并沒沒有找到C語言中const 提出的背景,但是一個(gè)可以參考的歷史是,常量這種數(shù)據(jù)形式早在匯編語言中就有所體現(xiàn),匯編語言中的constant 是一個(gè)確定的數(shù)值,在匯編階段就可以確定直接編碼在于指令代碼中,不是保存在寄存器中的可以變化的量。

常量是需求,C 語言沒理由不保留這個(gè)傳統(tǒng),自然而然的const 關(guān)鍵字出現(xiàn)了。

二、C和C++的異同點(diǎ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ò),證明*號前面是指針類型,這條真理沒錯(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ù)仍然是不行的)。

到此這篇關(guān)于C++11 關(guān)鍵字 const 使用小結(jié)的文章就介紹到這了,更多相關(guān)C++11 關(guān)鍵字 const內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt QWidget實(shí)現(xiàn)圖片旋轉(zhuǎn)動(dòng)畫

    Qt QWidget實(shí)現(xiàn)圖片旋轉(zhuǎn)動(dòng)畫

    這篇文章主要為大家詳細(xì)介紹了如何使用了Qt和QWidget實(shí)現(xiàn)圖片旋轉(zhuǎn)動(dòng)畫效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • C語言?動(dòng)態(tài)內(nèi)存管理全面解析

    C語言?動(dòng)態(tài)內(nèi)存管理全面解析

    動(dòng)態(tài)內(nèi)存是相對靜態(tài)內(nèi)存而言的。所謂動(dòng)態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存,本文帶你深入探究C語言中動(dòng)態(tài)內(nèi)存的管理
    2022-02-02
  • C++ string替換指定字符實(shí)例代碼

    C++ string替換指定字符實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于C++ string替換指定字符的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • C語言實(shí)現(xiàn)猜數(shù)字大小的游戲

    C語言實(shí)現(xiàn)猜數(shù)字大小的游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)猜數(shù)字大小的游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • C語言 結(jié)構(gòu)體數(shù)組詳解及示例代碼

    C語言 結(jié)構(gòu)體數(shù)組詳解及示例代碼

    本文主要介紹C語言 結(jié)構(gòu)體數(shù)組,這里整理了相關(guān)資料及簡單示例代碼,以便大家學(xué)習(xí)參考,有興趣的小伙伴可以看下
    2016-08-08
  • 關(guān)于雙向鏈表的增刪改查和排序的C++實(shí)現(xiàn)

    關(guān)于雙向鏈表的增刪改查和排序的C++實(shí)現(xiàn)

    下面小編就為大家?guī)硪黄P(guān)于雙向鏈表的增刪改查和排序的C++實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • C++詳細(xì)講解常用math函數(shù)的用法

    C++詳細(xì)講解常用math函數(shù)的用法

    C++提供了很多實(shí)用的數(shù)學(xué)函數(shù),如果要使用先添加頭文件,當(dāng)然,加頭文件誰都知道,接下來我們一起詳細(xì)看看各個(gè)math函數(shù)的實(shí)際使用
    2022-04-04
  • C/C++ int數(shù)與多枚舉值互轉(zhuǎn)的實(shí)現(xiàn)

    C/C++ int數(shù)與多枚舉值互轉(zhuǎn)的實(shí)現(xiàn)

    在C/C++在C/C++的開發(fā)中經(jīng)常會(huì)遇到各種數(shù)據(jù)類型互轉(zhuǎn)的情況,本文主要介紹了C/C++ int數(shù)與多枚舉值互轉(zhuǎn)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-08-08
  • 詳解編譯器編譯原理

    詳解編譯器編譯原理

    這篇文章主要介紹了詳解編譯器編譯原理的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • VC++ 使用 _access函數(shù)判斷文件或文件夾是否存在

    VC++ 使用 _access函數(shù)判斷文件或文件夾是否存在

    這篇文章主要介紹了VC++ 使用 _access函數(shù)判斷文件或文件夾是否存在的相關(guān)資料,需要的朋友可以參考下
    2015-10-10

最新評論

深州市| 古蔺县| 岑溪市| 科尔| 建阳市| 安陆市| 仙居县| 江山市| 东平县| 新沂市| 文安县| 清远市| 武城县| 宁化县| 乐至县| 江都市| 华宁县| 濮阳市| 桐乡市| 内黄县| 抚宁县| 嫩江县| 开化县| 蚌埠市| 游戏| 内丘县| 金溪县| 柏乡县| 辽宁省| 梁河县| 浙江省| 宝丰县| 宜章县| 博乐市| 榆林市| 常熟市| 牙克石市| 莱阳市| 禹城市| 都昌县| 灵川县|