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