日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C/C++中constkeyword

發布時間:2023/11/27 生活经验 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++中constkeyword 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?今天在做一個趨勢筆試題的時候。才讓我有了系統把constkeyword好好總結一下的沖動,由于這個關鍵詞大大小小好多地方都出現過,出現頻率很高,而每次僅僅是簡短的把答案看了一下,沒有真正將其整個使用方法弄透,立即要找工作了。為避免悲劇再次發生,不得不引起我的重視,這才有了這篇博文。 ????首先。一看到constkeyword,我們的第一反應就是定義常量。的確。這沒有錯。const就是constant的縮寫嘛,可是其實他的使用方法遠不止這些。

接下來我們一一來解說。

????在C程序中,const的使用方法主要有定義常量、修飾函數參數和修飾函數返回值。

而在C++程序中。它除了上述功能外,還能夠修飾函數的定義體,定義類中某個成員函數為恒態函數,即不改變類中的數據成員

。對于定義常量的使用方法,這里就不多說了,重點看一下修飾函數參數、修飾函數返回值以及修飾函數的定義體? ? 0)修飾變量或指針 int ii=0;?
const int i=0;? ? ? ? ?? //i是常量。i不會被改動?
? const int *p1i=&i;? ? ? ? //p1i所指內容是常量。能夠不初始化?
int const* p11i = &i; //同上,const在*號左邊,作用是一樣的。


? int? * const p2i=ⅈ? ? //p2i是常量。所指內容可改動?
? 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。