真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++中如何使用const關(guān)鍵字

本篇文章給大家分享的是有關(guān)C++中如何使用const關(guān)鍵字,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、外貿(mào)營銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的廣漢網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

const關(guān)鍵字

常類型是指使用類型修飾符const說明的類型,常類型的變量或?qū)ο蟮闹凳遣荒鼙桓碌摹2还艹霈F(xiàn)在任何上下文都是為這個(gè)目的而服務(wù)的。

const使用方法

定義const對(duì)象

const修飾符可以把對(duì)象轉(zhuǎn)變成常數(shù)對(duì)象,意思就是說利用const進(jìn)行修飾的變量的值在程序的任意位置將不能再被修改,就如同常數(shù)一樣使用!任何修改該變量的嘗試都會(huì)導(dǎo)致編譯錯(cuò)誤:

注意:因?yàn)槌A吭诙ㄒ院缶筒荒鼙恍薷?,所以定義時(shí)必須初始化:

對(duì)于類中的const成員變量必須通過初始化列表進(jìn)行初始化,如下所示:

const對(duì)象默認(rèn)為文件的局部變量

在全局作用域里定義非const變量時(shí),它在整個(gè)程序中都可以訪問,我們可以把一個(gè)非const變量定義在一個(gè)文件中,假設(shè)已經(jīng)做了合適的聲明,就可以在另外的文件中使用這個(gè)變量:

與其他變量不同,除非特別說明,在全局作用域聲明的const變量是定義該對(duì)象的文件的局部變量。此變量只存在于那個(gè)文件中,不能被其他文件訪問。通過指定const變量為extern,就可以在整個(gè)程序中訪問const對(duì)象。

注意:非const變量默認(rèn)為extern。要使const變量能夠在其他文件中訪問,必須在文件中顯式地指定它為extern。

const 引用

const引用是指向const對(duì)象的引用:

可以讀取但不能修改refVal,因此,任何對(duì)refVal的賦值都是不合法的。這個(gè)限制有其意義:不能直接對(duì)ival賦值,因此不能通過使用refVal來修改ival。同理,用ival初始化ref2也是不合法的:ref2是普通的非const引用,因此可以用來修改ref2指向的對(duì)象的值。通過ref2對(duì)ival賦值會(huì)導(dǎo)致修改const對(duì)象的值,為防止這樣的修改,需要規(guī)定將普通的引用綁定到const對(duì)象是不合法的。 const 引用可以初始化為不同類型的對(duì)象或者初始化為右值。如字面值常量:

同樣的初始化對(duì)于非const引用卻是不合法的,而且會(huì)導(dǎo)致編譯時(shí)錯(cuò)誤。其原因非常微妙,值得解釋一下。觀察將引用綁定到不同的類型時(shí)所發(fā)生的事情,最容易理解上述行為。對(duì)于下一段代碼:

編譯器會(huì)將這些代碼轉(zhuǎn)換為一下形式:

我們發(fā)現(xiàn)編譯器會(huì)創(chuàng)建一個(gè)int型的暫時(shí)變量存儲(chǔ)dval,然后將ri綁定到temp上。

注意:引用在內(nèi)部存放的是一個(gè)對(duì)象的地址,它是該對(duì)象的別名。對(duì)于不可尋址的值,如文字常量,以及不同類型的對(duì)象,編譯器為了實(shí)現(xiàn)引用,必須生成一個(gè)臨時(shí)對(duì)象,引用實(shí)際上指向該對(duì)象,但用戶不能訪問它。

如果ri不是const,那么可以給ri賦一新值。這樣做不會(huì)修改dval的,而是修改了temp。期望對(duì)ri賦值會(huì)修改dval的程序員會(huì)發(fā)現(xiàn)dval沒有被修改。僅允許const引用綁定到需要臨時(shí)使用的值完全避免了這個(gè)問題,直接告訴程序員不能修改,因?yàn)閏onst引用是只讀的哈~(其實(shí)就是避免程序員心理預(yù)期產(chǎn)生反差。。。)

注意:非const引用只能綁定到與該引用相同類型的對(duì)象。 const引用則可以綁定到不同但相關(guān)的類型的對(duì)象或綁定到右值。

const對(duì)象的動(dòng)態(tài)數(shù)組

如果我們?cè)谧杂纱鎯?chǔ)區(qū)中創(chuàng)建的數(shù)組存儲(chǔ)了內(nèi)置類型的const對(duì)象,則必須為這個(gè)數(shù)組提供初始化: 因?yàn)閿?shù)組元素都是const對(duì)象,無法賦值。實(shí)現(xiàn)這個(gè)要求的唯一方法是對(duì)數(shù)組做值初始化。

C++允許定義類類型的const數(shù)組,但該類類型必須提供默認(rèn)構(gòu)造函數(shù):

這里便會(huì)調(diào)用string類的默認(rèn)構(gòu)造函數(shù)初始化數(shù)組元素。

指針和const限定符的關(guān)系(重點(diǎn)?。。。。。?!非常容易搞混)

const限定符和指針結(jié)合起來常見的情況有以下幾種。

指向常量的指針(指向const對(duì)象的指針)

C++為了保證不允許使用指針改變所指的const值這個(gè)特性,強(qiáng)制要求這個(gè)指針也必須具備const特性:

這里cptr是一個(gè)指向double類型const對(duì)象的指針,const先頂了cptr指向的對(duì)象的類型,而并非cptr本身,所以cptr本身并不是const。所以定義的時(shí)候并不需要對(duì)它進(jìn)行初始,如果需要的話,允許給cptr重新賦值,讓其指向另一個(gè)const對(duì)象。但不能通過cptr修改其所指對(duì)象的值。

而我們將一個(gè)const對(duì)象的地址賦給一個(gè)普通的非const指針也會(huì)導(dǎo)致編譯錯(cuò)誤。

不能使用void*指針保存const對(duì)象的地址,必須使用const void*類型的指針保存const對(duì)象的地址。

下面令人頭暈的一個(gè)問題來了----à 允許把非const對(duì)象的地址賦給指向const對(duì)象的指針,例如:

但是我們不能通過cptr指針來修改dval的值?。?!即使它指向的是非const對(duì)象。

然后,我們一定要知道,不能使用指向const對(duì)象的指針修改基礎(chǔ)對(duì)象,然而如果該指針指向了非const對(duì)象,可用其他方式修改其所指的對(duì)象,所以事實(shí)上,可以修改const指針?biāo)赶虻闹档?,但是不能通過const對(duì)象指針來進(jìn)行而已!如下所示:

通過以上,我們知道指向const對(duì)象的指針 確切的講: 自以為指向const的指針!

常指針(const指針)

C++中還提供了const指針——本身的值不能被修改。

我們可以從右往左把上述定義語句讀作"指向int型對(duì)象的const指針"。與其他const量一樣,const指針的值不能被修改,這意味著不能使curErr指向其他對(duì)象。Const指針也必須在定義的時(shí)候初始化。

指針本身是const的試試并沒有說明是否能用改真真修改其所指向的對(duì)象的值。指針對(duì)象的值能否修改完全取決于該對(duì)象的類型。

指向常量的常指針(指向const對(duì)象的const指針)

如下可以這樣定義:

這樣pi_ptr首先是一個(gè)const指針,然后其指向一個(gè)const對(duì)象~~~

函數(shù)和const限定符的關(guān)系(另一難點(diǎn)?。?!理解)

類中的const成員函數(shù)(常量成員函數(shù))

在一個(gè)類中,任何不會(huì)修改數(shù)據(jù)成員的函數(shù)都應(yīng)該聲明為const類型。如果在編寫const成員函數(shù)時(shí),不慎修改了數(shù)據(jù)成員,或者調(diào)用了其它非const成員函數(shù),編譯器將指出錯(cuò)誤,這無疑會(huì)提高程序的健壯性。使用const關(guān)鍵字進(jìn)行說明的成員函數(shù),稱為常成員函數(shù)。只有常成員函數(shù)才有資格操作常量或常對(duì)象,沒有使用const關(guān)鍵字說明的成員函數(shù)不能用來操作常對(duì)象。常成員函數(shù)說明格式如下:

<類型說明符> <函數(shù)名> (<參數(shù)表>) const;

其中,const是加在函數(shù)說明后面的類型修飾符,它是函數(shù)類型的一個(gè)組成部分,因此,在函數(shù)實(shí)現(xiàn)部分也要帶const關(guān)鍵字。下面舉一例子說明常成員函數(shù)的特征。

函數(shù)重載

既然const是定義為const函數(shù)的組成部分,那么就可以通過添加const實(shí)現(xiàn)函數(shù)重載咯。

其中print成員函數(shù)就實(shí)現(xiàn)了兩個(gè)版本~~~ 重載哦,輸出結(jié)果為 5,52。 const對(duì)象默認(rèn)調(diào)用const成員函數(shù)。

const 修飾函數(shù)返回值

const修飾函數(shù)返回值其實(shí)用的并不是很多,它的含義和const修飾普通變量以及指針的含義基本相同。如下所示:

一般情況下,函數(shù)的返回值為某個(gè)對(duì)象時(shí),如果將其聲明為const時(shí),多用于操作符的重載。通常,不建議用const修飾函數(shù)的返回值類型為某個(gè)對(duì)象或?qū)δ硞€(gè)對(duì)象引用的情況。原因如下:如果返回值為某個(gè)對(duì)象為const(const A test = A 實(shí)例)或某個(gè)對(duì)象的引用為const(const A& test = A實(shí)例) ,則返回值具有const屬性,則返回實(shí)例只能訪問類A中的公有(保護(hù))數(shù)據(jù)成員和const成員函數(shù),并且不允許對(duì)其進(jìn)行賦值操作,這在一般情況下很少用到。

const修飾函數(shù)參數(shù)

傳遞過來的參數(shù)在函數(shù)內(nèi)不可以改變(無意義,因?yàn)閂ar本身就是形參)

參數(shù)指針?biāo)竷?nèi)容為常量不可變

參數(shù)指針本身為常量不可變(也無意義,因?yàn)閏har* Var也是形參)

參數(shù)為引用,為了增加效率同時(shí)防止修改。修飾引用參數(shù)時(shí):

這樣的一個(gè)const引用傳遞和最普通的函數(shù)按值傳遞的效果是一模一樣的,他禁止對(duì)引用的對(duì)象的一切修改,唯一不同的是按值傳遞會(huì)先建立一個(gè)類對(duì)象的副本, 然后傳遞過去,而它直接傳遞地址,所以這種傳遞比按值傳遞更有效.另外只有引用的const傳遞可以傳遞一個(gè)臨時(shí)對(duì)象,因?yàn)榕R時(shí)對(duì)象都是const屬性, 且是不可見的,他短時(shí)間存在一個(gè)局部域中,所以不能使用指針,只有引用的const傳遞能夠捕捉到這個(gè)家伙.

const限定符和static的區(qū)別

const定義的常量在超出其作用域之后其空間會(huì)被釋放,而static定義的靜態(tài)常量在函數(shù)執(zhí)行后不會(huì)釋放其存儲(chǔ)空間。static表示的是靜態(tài)的。類的靜態(tài)成員函數(shù)、靜態(tài)成員變量是和類相關(guān)的,而不是和類的具體對(duì)象相關(guān)的。即使沒有具體對(duì)象,也能調(diào)用類的靜態(tài)成員函數(shù)和成員變量。一般類的靜態(tài)函數(shù)幾乎就是一個(gè)全局函數(shù),只不過它的作用域限于包含它的文件中。在C++中,static靜態(tài)成員變量不能在類的內(nèi)部初始化。在類的內(nèi)部只是聲明,定義必須在類定義體的外部,通常在類的實(shí)現(xiàn)文件中初始化,如:double Account::Rate=2.25; static關(guān)鍵字只能用于類定義體內(nèi)部的聲明中,定義時(shí)不能標(biāo)示為static在C++中,const成員變量也不能在類定義處初始化,只能通過構(gòu)造函數(shù)初始化列表進(jìn)行,并且必須有構(gòu)造函數(shù)。const數(shù)據(jù)成員,只在某個(gè)對(duì)象生存期內(nèi)是常量,而對(duì)于整個(gè)類而言卻是可變的。因?yàn)轭惪梢詣?chuàng)建多個(gè)對(duì)象,不同的對(duì)象其const數(shù)據(jù)成員的值可以不同。所以不能在類的聲明中初始化const數(shù)據(jù)成員,因?yàn)轭惖膶?duì)象沒被創(chuàng)建時(shí),編譯器不知道const數(shù)據(jù)成員的值是什么。

const數(shù)據(jù)成員的初始化只能在類的構(gòu)造函數(shù)的初始化列表中進(jìn)行。要想建立在整個(gè)類中都恒定的常量,應(yīng)該用類中的枚舉常量來實(shí)現(xiàn),或者static const。

const成員函數(shù)主要目的是防止成員函數(shù)修改對(duì)象的內(nèi)容。即const成員函數(shù)不能修改成員變量的值,但可以訪問成員變量。當(dāng)方法成員函數(shù)時(shí),該函數(shù)只能是const成員函數(shù)。

static成員函數(shù)主要目的是作為類作用域的全局函數(shù)。不能訪問類的非靜態(tài)數(shù)據(jù)成員。類的靜態(tài)成員函數(shù)沒有this指針,這導(dǎo)致:

1、不能直接存取類的非靜態(tài)成員變量,調(diào)用非靜態(tài)成員函數(shù)

2、不能被聲明為virtual

其中關(guān)于static、const、static cosnt、const static成員的初始化問題:

類里的const成員初始化在一個(gè)類里建立一個(gè)const時(shí),不能給他初值

類里的const成員初始化

類中的static變量是屬于類的,不屬于某個(gè)對(duì)象,它在整個(gè)程序的運(yùn)行過程中只有一個(gè)副本,因此不能在定義對(duì)象時(shí) 對(duì)變量進(jìn)行初始化,就是不能用構(gòu)造函數(shù)進(jìn)行初始化,其正確的初始化方法是:

數(shù)據(jù)類型 類名::靜態(tài)數(shù)據(jù)成員名=值

類里的static cosnt 和 const static成員初始化(這兩種寫法是一致的!?。?/p>

最后通過一個(gè)完整的例子展示以上結(jié)果:

const 的難點(diǎn)

如果函數(shù)需要傳入一個(gè)指針,面試官可能會(huì)問是否需要為該指針加上const,把const加在指針不同的位置有什么區(qū)別;如果寫的函數(shù)需要傳入的參數(shù)是一個(gè)復(fù)雜類型的實(shí)例,面試官可能會(huì)問傳入值參數(shù)或者引用參數(shù)有什么區(qū)別,什么時(shí)候需要為傳入的引用參數(shù)加上const。 const是用來聲明一個(gè)常量的,當(dāng)你不想讓一個(gè)值被改變時(shí)就用const,const int max和int const max 是沒有區(qū)別的,都可以。不涉及到指針const很好理解。一旦涉及到指針,則比較容易出問題。

如果const位于星號(hào)的左側(cè),則const就是用來修飾指針?biāo)赶虻淖兞浚粗羔樦赶虻膶?duì)象為常量;如果const位于星號(hào)的右側(cè),const就是修飾指針本身,即指針本身是常量。

因此,[1]和[2]的情況相同,都是指針?biāo)赶虻膬?nèi)容為常量(const放在變量聲明符的位置無關(guān)),這種情況下不允許對(duì)內(nèi)容進(jìn)行更改操作,如不能*a = 3 ;[3]為指針本身是常量,而指針?biāo)赶虻膬?nèi)容不是常量,這種情況下不能對(duì)指針本身進(jìn)行更改操作,如a++是錯(cuò)誤的;[4]為指針本身和指向的內(nèi)容均為常量。

如果理解了上面的所有信息,我相信應(yīng)該問題不大。僅供參考~~~ 希望大家熱烈討論哈。 好了,先寫到這里,在以后需要補(bǔ)充我再加?xùn)|西吧。。。敲得手疼~~~ ~?。?!

下面是其他網(wǎng)友的補(bǔ)充

在類中,如果你不希望某些數(shù)據(jù)被修改,可以使用const關(guān)鍵字加以限定。const 可以用來修飾成員變量、成員函數(shù)以及對(duì)象。

一、const 成員變量

const 成員變量的用法和普通 const 變量的用法相似,只需要在聲明時(shí)加上 const 關(guān)鍵字。初始化 const 成員變量只有一種方法,就是通過參數(shù)初始化表

二、const 成員函數(shù)

const 成員函數(shù)可以使用類中的所有成員變量,但是不能修改成員變量,這種措施主要還是為了保護(hù)數(shù)據(jù)而設(shè)置的。const 成員函數(shù)也稱為常成員函數(shù)。

常成員函數(shù)需要在聲明和定義的時(shí)候在函數(shù)頭部的結(jié)尾都加上 const 關(guān)鍵字,如:

class Student{public:  Student(char *name, int age, float score);  void show();  //聲明常成員函數(shù)  char *getname() const;  int getage() const;  float getscore() const;private:  char *m_name;  int m_age;  float m_score;};Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){ }void Student::show(){  cout<

三.const對(duì)象

一旦將對(duì)象定義為const 對(duì)象之后,不管是哪種形式,則該對(duì)象就只能訪問被 const 修飾的成員了(包括 const 成員變量和 const 成員函數(shù)),因?yàn)榉?const 成員可能會(huì)修改對(duì)象的數(shù)據(jù)(編譯器也會(huì)這樣假設(shè)),C++禁止這樣做。

例:

#include using namespace std;class Student{public:  Student(char *name, int age, float score);public:  void show();  char *getname() const;  int getage() const;  float getscore() const;private:  char *m_name;  int m_age;  float m_score;};Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){ }void Student::show(){  cout< show(); //error  cout<getname()<<"的年齡是"<getage()<<",成績是"<getscore()<

以上就是C++中如何使用const關(guān)鍵字,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


新聞名稱:C++中如何使用const關(guān)鍵字
文章URL:http://weahome.cn/article/ipjiso.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部