C/C++中Static和Const的作用
生活随笔
收集整理的這篇文章主要介紹了
C/C++中Static和Const的作用
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?C/C++中Static和Const的作用
? ? 【尊重原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處】http://blog.csdn.net/guyuealian/article/details/53118850 一、const的作用?: ? ?const是C語言的一種關(guān)鍵字,它所限定的變量是不允許被改變的,從而起到保護(hù)的作用!const關(guān)鍵字可以用于修飾變量,參數(shù),返回值,甚至函數(shù)體。const可以提高程序的健壯性,減少程序出錯(cuò)。?(一)const用于定義常量和修飾變量 ? ?當(dāng)定義某個(gè)變量時(shí),用const修飾,則該變量就變?yōu)槌A?#xff0c;其值定義后就不能再改變了,如:const int x=1;常量x的值不能再改變了。 TYPE const ValueName = value; //TYPE表示數(shù)據(jù)類型int、long、float等 const TYPE ValueName = value; //TYPE表示數(shù)據(jù)類型int、long、float等 (1)const 修飾變量,表示該變量不能被修改。
? 1、const char *p 表示指針p指向的內(nèi)容不能改變
? 2、char * const p,就是將P聲明為常指針,它的地址不能改變。
? 3、這種const指針是前兩種的結(jié)合,使得指向的內(nèi)容和地址都不能發(fā)生變化.
const double pi = 3.14159;//pi是常數(shù) const double *const pi_ptr = π
(二)const修飾函數(shù)形式參數(shù)
? (1)傳遞過來的參數(shù)在函數(shù)內(nèi)不可以改變(無意義,因?yàn)閂ar本身就是形參)
void function(const int Var); ? (2)參數(shù)指針?biāo)傅膬?nèi)容為常量不可變
void function(const char* Var); ? (3)參數(shù)指針本身為常量不可變(也無意義,因?yàn)閏har* Var也是形參)
void function(char* const Var); ? (4)參數(shù)為引用,為了增加效率同時(shí)防止修改。修飾引用參數(shù)時(shí):
void function(const Class& Var); //引用參數(shù)在函數(shù)內(nèi)不可以改變 void function(const TYPE& Var); //引用參數(shù)在函數(shù)內(nèi)為常量不可變? ?當(dāng)輸入?yún)?shù)為用戶自定義類型和抽象數(shù)據(jù)類型時(shí),將“值傳遞”改為“const&傳遞”可以提高效率,可以比較如下的代碼: void fun(A a); void fun(A const& a);? ?第一個(gè)函數(shù)效率較低,函數(shù)體內(nèi)產(chǎn)生A類型的臨時(shí)對(duì)象用于“值傳遞”參數(shù)a,而臨時(shí)對(duì)象的構(gòu)造、復(fù)制、析構(gòu)過程都需要消耗資源和時(shí)間的,但使用第二種方式,按“引用傳遞”不需要產(chǎn)生臨時(shí)對(duì)象,省了臨時(shí)對(duì)象的構(gòu)造、復(fù)制、析構(gòu)的過程,因此效率較高。而之所以用const修飾a,是為了保證引用a不被修改。 ?(二)const修飾函數(shù)返回值 ?(1)函數(shù)按const指針返回,表示該指針不能被改動(dòng),只能把該指針賦給const修飾的同類型指針變量。 const char *GetChar(void){}; char*ch=GetChar();//錯(cuò)誤,按指針返回時(shí),該函數(shù)返回值只能被賦值給const修飾的同類型指針 const char *ch=GetChar();//正確? (2)函數(shù)按值返回,函數(shù)會(huì)把返回值賦給外部臨時(shí)變量,用const無意義!不管是內(nèi)部還是非內(nèi)部數(shù)據(jù)類型。 int const get(){return this->n;} int temp=i.get();//正確,按值傳遞時(shí),接受返回值有無const均可? (3)函數(shù)采用引用方式返回的場合不多,只出現(xiàn)在類的賦值函數(shù)中,目的是為了實(shí)現(xiàn)鏈?zhǔn)奖磉_(dá)。
? (三)const修飾類的成員函數(shù)(函數(shù)定義體): ? ? 通常,任何不需要修改數(shù)據(jù)成員的函數(shù)都應(yīng)該聲明為const類型,這樣,如果const成員函數(shù)修改了數(shù)據(jù)成員或者調(diào)用了其他函數(shù)修改數(shù)據(jù)成員,編譯器都將報(bào)錯(cuò)!
class stack { public:int GetCount(void) const ; private:int m_num; }; int stack::GetCount(void) const {m_num++; }編譯器輸出錯(cuò)誤信息:error C2166: l-value specifies const object。
例題:給定聲明 const char * const * pp; 下列操作或說明正確的是? ? A.pp++
? B.(*pp)++
? C.(**pp) = \\c\\;
? D.以上都不對(duì)
? 正確答案: A ?
【詳細(xì)解釋】:const 限定一個(gè)對(duì)象為只讀屬性。? ? ? 分析的原則:
? ? char const *ptr:若const限定符在*之前,則const限定的是*ptr。也就是說,ptr可以改變其所指向的對(duì)象,但不能通過該指針修改其所指向?qū)ο蟮闹怠? 若const限定符在*之后,則const限定的是ptr而不限定*ptr。也就是說,ptr不可以改變其所指向的對(duì)象,但能通過該指針修改其所指向?qū)ο蟮闹怠?若在*之前有const限定符且在*之后也有const限定符,則ptr與*ptr都被限定。也就是說,ptr既不可以改變其所指向的對(duì)象,也不能通過該指針修改其所指向?qū)ο蟮闹怠?/span>先從一級(jí)指針說起吧:? (1)const char p ?//限定變量p為只讀。這樣如p=2這樣的賦值操作就是錯(cuò)誤的。?
(2)const char *p ?//p為一個(gè)指向char類型的指針,const只限定p指向的對(duì)象為只讀。這樣,p=&a或 ?p++等操作都是合法的,但如*p=4這樣的操作就錯(cuò)了,因?yàn)槠髨D改寫這個(gè)已經(jīng)被限定為只讀屬性的對(duì)象。 (const 限定*p,即限定p指向的內(nèi)容)
(3)char *const p ?限定此指針為只讀,這樣p=&a或 ?p++等操作都是不合法的。而*p=3這樣的操作合法,因?yàn)椴]有限定其最終對(duì)象為只讀。 (const直接與p結(jié)合,因此這里只限定了指針本身p,但內(nèi)容可以修改 )
(4)const char *const p 兩者皆限定為只讀,不能改寫。 (結(jié)合方向:const char *(const p))
? ?有了以上的對(duì)比,再來看二級(jí)指針問題:?
(1)const char **p ?p為一個(gè)指向指針的指針,const限定其最終對(duì)象為只讀,顯然這最終對(duì)象也是為char類型的變量。故像**p=3這樣的賦值是錯(cuò)誤的,而像*p=? p++這樣的操作合法。?
(2)const char * const *p 限定最終對(duì)象和 p指向的指針為只讀。這樣 *p=?的操作也是錯(cuò)的。?
(3)const char * const * const p 全部限定為只讀,都不可以改寫。
總結(jié)
以上是生活随笔為你收集整理的C/C++中Static和Const的作用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA 内存泄露详解(原因、例子及解决
- 下一篇: C/C++ VS中调用matlab函数的