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