C/C++中constkeyword
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                C/C++中constkeyword
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                
                            
                            
                            ?今天在做一個趨勢筆試題的時候。才讓我有了系統把constkeyword好好總結一下的沖動,由于這個關鍵詞大大小小好多地方都出現過,出現頻率很高,而每次僅僅是簡短的把答案看了一下,沒有真正將其整個使用方法弄透,立即要找工作了。為避免悲劇再次發生,不得不引起我的重視,這才有了這篇博文。  ????首先。一看到constkeyword,我們的第一反應就是定義常量。的確。這沒有錯。const就是constant的縮寫嘛,可是其實他的使用方法遠不止這些。
const int i=0;? ? ? ? ?? //i是常量。i的值不會被改動?
? const int *p1i=&i;? ? ? ? //指針p1i所指內容是常量。能夠不初始化? int const* p11i = &i; //同上,const在*號左邊,作用是一樣的。
? const int * const p3i=&i; //指針p3i是常量。所指內容也是常量?
? p1i=ⅈ? ? ? ? ? ?? ? ? //合法?
? *p2i=100;? ? ? ? ? ?? ? //合法 ????1)修飾函數參數 ????首先假設該參數用于輸出,那么不管是採用指針傳遞還是引用傳遞,都不能加const修飾。所以const僅僅能用于修飾輸入參數。這里又分三種情況:輸入參數採用值傳遞還是指針傳遞還是引用傳遞。 ????(1)假設採用值傳遞。因為函數將自己主動產生暫時變量用于復制該參數,該輸入參數本來就無需保護,所以不須要加const?修飾。 ?????比如。對于函數void Func1(int x)。寫成void Func1(const int x)一點意義也沒有。
??????2)修飾函數的返回值 ??????依據上面的思路,這里也分三種情況。即值傳遞、指針傳遞、引用傳遞。 ??????(1)假設函數返回值採用“值傳遞”方式,因為函數會把返回值拷貝到外部暫時的存儲單元中,加const?修飾沒有不論什么價值。 ?????比如,不要把函數int GetInt(void)?寫成const int GetInt(void)。同理不要把函數A GetA(void)?寫成const A GetA(void),當中A?為用戶自己定義的數據類型。 ????(2)假設函數返回值採用“指針傳遞”方式。那么函數返回值(即指針)的內容不能被改動,該返回值僅僅能被賦給加const?修飾的同類型指針。 ?????比如,定義函數為:const char *GetString(void),那么char *str = GetString()將會出現編譯錯誤。應該寫成const char *str = GetString()。 ????(3)假設函數返回值是採用“引用傳遞”方式,它的意義在于能提供啊效率,而這樣的方式使用場合并不多。這個時候,一定要搞清楚函數到底是想返回一個對象的“拷貝”還是僅返回“別名”就能夠了,否則程序會出錯。 ?????比如。對于類的重載賦值函數A & operate = (const A &other),假設不加cons修飾,則定義A a, b, c;(a = b) = c,程序合法。可是假設加上const修飾,即const?A & operate = (const A &other)。則程序會報錯。
???????3)修飾函數的定義體。 ???????定義const函數。僅僅須要將constkeyword放在函數聲明的尾部。不論什么不會改動類的數據成員的函數都應該聲明為const?類型。
????到這里,constkeyword的解說就結束了。下面是幾點使用const的幾點規則。 ????1) const對象僅僅能訪問const成員函數,而非const對象能夠訪問隨意的成員函數,包含const成員函數。 ????2) const對象的成員是不可改動的,然而const對象通過指針維護的對象卻是能夠改動的。 ????3) const成員函數不能夠改動對象的數據,無論對象是否具有const性質.它在編譯時,以是否改動成員數據為根據,進行檢查。 ????4) 然而加上mutable修飾符的數據成員,對于不論什么情況下通過不論什么手段都可改動,自然此時的const成員函數是能夠改動它的。
                        
                        
                        接下來我們一一來解說。
????在C程序中,const的使用方法主要有定義常量、修飾函數參數和修飾函數返回值。而在C++程序中。它除了上述功能外,還能夠修飾函數的定義體,定義類中某個成員函數為恒態函數,即不改變類中的數據成員
。對于定義常量的使用方法,這里就不多說了,重點看一下修飾函數參數、修飾函數返回值以及修飾函數的定義體。 ? ? 0)修飾變量或指針 int ii=0;?const int i=0;? ? ? ? ?? //i是常量。i的值不會被改動?
? const int *p1i=&i;? ? ? ? //指針p1i所指內容是常量。能夠不初始化? int const* p11i = &i; //同上,const在*號左邊,作用是一樣的。
? const int * const p3i=&i; //指針p3i是常量。所指內容也是常量?
? p1i=ⅈ? ? ? ? ? ?? ? ? //合法?
? *p2i=100;? ? ? ? ? ?? ? //合法 ????1)修飾函數參數 ????首先假設該參數用于輸出,那么不管是採用指針傳遞還是引用傳遞,都不能加const修飾。所以const僅僅能用于修飾輸入參數。這里又分三種情況:輸入參數採用值傳遞還是指針傳遞還是引用傳遞。 ????(1)假設採用值傳遞。因為函數將自己主動產生暫時變量用于復制該參數,該輸入參數本來就無需保護,所以不須要加const?修飾。 ?????比如。對于函數void Func1(int x)。寫成void Func1(const int x)一點意義也沒有。
同理,對于void Func2(A a)也不須要寫成void Func2(const A a),當中A為用戶自己定義的對象類型。
????(2)假設採用指針傳遞,那么加const能夠防止函數體內部對該參數進行改變。起到保護作用。 ?????比如。如果StringCopy函數定義為:void StringCopy(char *strDest, const char *strSrc)。那么,如果函數體試圖改變strSrc的內容,編譯器將報錯。 ????(3)假設採用引用傳遞。 ?????首先我們來說一下,為什么要引入引用傳遞這樣的方法。原因是:對于非內部數據類型的參數而言,象void Func(A a)?這樣聲明的函數注定效率比較底。由于函數體內將產生A?類型的暫時對象用于復制參數a,而暫時對象的構造、復制、析構過程都將消耗時間。為了提高效率。能夠將函數聲明改為void Func(A& a)。這樣一來,依據引用傳遞的定義,僅僅是借用了參數的別名,不須要產生暫時對象。 ??????可是,這樣一來,當函數體中改變了參數a的值后,對應的傳遞的原始值也會對應改變。所以假設不希望改變原始參數。僅僅須要在前面加上const修飾。這樣一來。函數終于定義為void Func(const A& a)。同理,是否應將void Func(int x)?改寫為void Func(const int &x),以便提高效率?全然沒有必要。由于內部數據類型的參數不存在構造、析構的過程,而復制也很快。“值傳遞”和“引用傳遞”的效率差點兒相當。 ?????總結一下const作為函數輸入參數的使用方法: ?????(1)對于非內部數據類型的輸入參數,應該將“值傳遞”的方式改為“const?引用傳遞”,目的是提高效率。比如將
void Func(A a)?改為void Func(const A &a)。 ?????????(2)對于內部數據類型的輸入參數。不要將“值傳遞”的方式改為“const?引用傳遞”。否則既達不到提高效率的目的,又減少了函數的可理解性。比如void Func(int x)?不應該改為void Func(const int &x)。??????2)修飾函數的返回值 ??????依據上面的思路,這里也分三種情況。即值傳遞、指針傳遞、引用傳遞。 ??????(1)假設函數返回值採用“值傳遞”方式,因為函數會把返回值拷貝到外部暫時的存儲單元中,加const?修飾沒有不論什么價值。 ?????比如,不要把函數int GetInt(void)?寫成const int GetInt(void)。同理不要把函數A GetA(void)?寫成const A GetA(void),當中A?為用戶自己定義的數據類型。 ????(2)假設函數返回值採用“指針傳遞”方式。那么函數返回值(即指針)的內容不能被改動,該返回值僅僅能被賦給加const?修飾的同類型指針。 ?????比如,定義函數為:const char *GetString(void),那么char *str = GetString()將會出現編譯錯誤。應該寫成const char *str = GetString()。 ????(3)假設函數返回值是採用“引用傳遞”方式,它的意義在于能提供啊效率,而這樣的方式使用場合并不多。這個時候,一定要搞清楚函數到底是想返回一個對象的“拷貝”還是僅返回“別名”就能夠了,否則程序會出錯。 ?????比如。對于類的重載賦值函數A & operate = (const A &other),假設不加cons修飾,則定義A a, b, c;(a = b) = c,程序合法。可是假設加上const修飾,即const?A & operate = (const A &other)。則程序會報錯。
???????3)修飾函數的定義體。 ???????定義const函數。僅僅須要將constkeyword放在函數聲明的尾部。不論什么不會改動類的數據成員的函數都應該聲明為const?類型。
假設在編寫
const?成員函數時,不慎改動了數據成員。或者調用了其他非const?成員函數。編譯器將報錯。這無疑會提高程序的健壯性。 ????比如。下面程序中,類stack?的成員函數GetCount?僅用于計數,從邏輯上講GetCount?應當為const?函數。編譯器將指出GetCount?函數中的錯誤。 class Stack { public: void Push(int elem); int Pop(void); int GetCount(void) const; // const 成員函數 private: int m_num; int m_data[100]; }; int Stack::GetCount(void) const { ++ m_num; // 編譯錯誤,企圖改動數據成員m_num Pop(); // 編譯錯誤。企圖調用非const 函數 return m_num; }????到這里,constkeyword的解說就結束了。下面是幾點使用const的幾點規則。 ????1) const對象僅僅能訪問const成員函數,而非const對象能夠訪問隨意的成員函數,包含const成員函數。 ????2) const對象的成員是不可改動的,然而const對象通過指針維護的對象卻是能夠改動的。 ????3) const成員函數不能夠改動對象的數據,無論對象是否具有const性質.它在編譯時,以是否改動成員數據為根據,進行檢查。 ????4) 然而加上mutable修飾符的數據成員,對于不論什么情況下通過不論什么手段都可改動,自然此時的const成員函數是能夠改動它的。
轉載于:https://www.cnblogs.com/bhlsheji/p/5173445.html
總結
以上是生活随笔為你收集整理的C/C++中constkeyword的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 缘起缘灭下一句是什么呢?
 - 下一篇: HDU——1106排序(istrings