C++編程中的const症結字罕見用法總結。本站提示廣大學習愛好者:(C++編程中的const症結字罕見用法總結)文章只能為提供參考,不一定能成為您想要的結果。以下是C++編程中的const症結字罕見用法總結正文
1、界說常量
(1)const潤飾變量,以下兩種界說情勢在實質上是一樣的。它的寄義是:const潤飾的類型為TYPE的變量value是弗成變的。
TYPE const ValueName = value; const TYPE ValueName = value;
(2)將const改成內部銜接,感化於擴展至全局,編譯時會分派內存,而且可以不停止初始化,僅僅作為聲明,編譯器以為在法式其他處所停止了界說.
extend const int ValueName = value;
2、指針應用CONST
(1)指針自己是常量弗成變
(char*) const pContent; const (char*) pContent;
(2)指針所指向的內容是常量弗成變
const (char) *pContent; (char) const *pContent;
(3)二者都弗成變
const char* const pContent;
(4)還有個中差別辦法,沿著*號整齊條線:
假如const位於*的左邊,則const就是用來潤飾指針所指向的變量,即指針指向為常量;
假如const位於*的右邊,const就是潤飾指針自己,即指針自己是常量。
3、函數中應用CONST
(1)const潤飾函數參數
a.傳遞過去的參數在函數內弗成以轉變(有意義,由於Var自己就是形參)
void function(const int Var);
b.參數指針所指內容為常量弗成變
void function(const char* Var);
c.參數指針自己為常量弗成變(也有意義,由於char* Var也是形參)
void function(char* const Var);
d.參數為援用,為了增長效力同時避免修正。潤飾援用參數時:
void function(const Class& Var); //援用參數在函數內弗成以轉變 void function(const TYPE& Var); //援用參數在函數內為常量弗成變
如許的一個const援用傳遞和最通俗的函數按值傳遞的後果是如出一轍的,他制止對援用的對象的一切修正,獨一分歧的是按值傳遞會先樹立一個類對象的正本, 然後傳遞曩昔,而它直接傳遞地址,所以這類傳遞比按值傳遞更有用.別的只要援用的const傳遞可以傳遞一個暫時對象,由於暫時對象都是const屬性, 且是弗成見的,他短時光存在一個部分域中,所以不克不及應用指針,只要援用的const傳遞可以或許捕獲到這個家伙.
(2)const 潤飾函數前往值
const潤飾函數前往值其適用的其實不是許多,它的寄義和const潤飾通俗變量和指針的寄義根本雷同。
a.const int fun1() //這個其實有意義,由於參數前往自己就是賦值。 b. const int * fun2() //挪用時 const int *pValue = fun2(); //我們可以把fun2()看做成一個變量,即指針內容弗成變。 c.int* const fun3() //挪用時 int * const pValue = fun2(); //我們可以把fun2()看做成一個變量,即指針自己弗成變。
普通情形下,函數的前往值為某個對象時,假如將其聲明為const時,多用於操作符的重載。平日,不建議用const潤飾函數的前往值類型為某個對象或對某個對象援用的情形。緣由以下:假如前往值為某個對象為const(const A test = A 實例)或某個對象的援用為const(const A& test = A實例) ,則前往值具有const屬性,則前往實例只能拜訪類A中的私有(掩護)數據成員和const成員函數,而且不許可對其停止賦值操作,這在普通情形下很罕用到。
4、類相干CONST
(1)const潤飾成員變量
const潤飾類的成員函數,表現成員常量,不克不及被修正,同時它只能在初始化列表中賦值。
class A { … const int nValue; //成員常量不克不及被修正 … A(int x): nValue(x) { } ; //只能在初始化列表中賦值 }
(2)const潤飾成員函數
const潤飾類的成員函數,則該成員函數不克不及修正類中任何非const成員函數。普通寫在函數的最初來潤飾。
class A { … void function()const; //常成員函數, 它不轉變對象的成員變量. //也不克不及挪用類中任何非const成員函數。 }
關於const類對象/指針/援用,只能挪用類的const成員函數,是以,const潤飾成員函數的最主要感化就是限制關於const對象的應用。
a. const成員函數不被許可修正它地點對象的任何一個數據成員。
b. const成員函數可以或許拜訪對象的const成員,而其他成員函數弗成以。
(3)const潤飾類對象/對象指針/對象援用
· const潤飾類對象表現該對象為常量對象,個中的任何成員都不克不及被修正。關於對象指針和對象援用也是一樣。
· const潤飾的對象,該對象的任何非const成員函數都不克不及被挪用,由於任何非const成員函數會有修正成員變量的妄圖。
例如:
class AAA { void func1(); void func2() const; } const AAA aObj; aObj.func1(); × aObj.func2(); 准確 const AAA* aObj = new AAA(); aObj-> func1(); × aObj-> func2(); 准確
5、用const 潤飾函數的參數
假如參數作輸入用,豈論它是甚麼數據類型,也豈論它采取“指針傳遞”照樣“援用傳遞”,都不克不及加const 潤飾,不然該參數將掉去輸入功效。const 只能潤飾輸出參數:
假如輸出參數采取“指針傳遞”,那末加const 潤飾可以避免不測地修改該指針,起到掩護感化。
例如StringCopy 函數:
void StringCopy(char *strDestination, const char *strSource);
個中strSource 是輸出參數,strDestination 是輸入參數。給strSource 加上const潤飾後,假如函數體內的語句試圖修改strSource 的內容,編譯器將指失足誤。
假如輸出參數采取“值傳遞”,因為函數將主動發生暫時變量用於復制該參數,該輸出參數原來就無需掩護,所以不要加const 潤飾。
例如不要將函數void Func1(int x) 寫成void Func1(const int x)。同理不要將函數void Func2(A a) 寫成void Func2(const A a)。個中A 為用戶自界說的數據類型。
關於非外部數據類型的參數而言,象void Func(A a) 如許聲明的函數注定效力比擬底。由於函數體內將發生A 類型的暫時對象用於復制參數a,而暫時對象的結構、復制、析構進程都將消費時光。
為了進步效力,可以將函數聲明改成void Func(A &a),由於“援用傳遞”僅借用一下參數的別號罷了,不須要發生暫時對象。然則函數void Func(A &a) 存在一個缺陷:
“援用傳遞”有能夠轉變參數a,這是我們不希冀的。處理這個成績很輕易,加const潤飾便可,是以函數終究成為void Func(const A &a)。
以此類推,能否應將void Func(int x) 改寫為void Func(const int &x),以便進步效力?完整沒有需要,由於外部數據類型的參數不存在結構、析構的進程,而復制也異常快,“值傳遞”和“援用傳遞”的效力簡直相當。
成績是如斯的缱绻,我只好將“const &”潤飾輸出參數的用法總結一下。
關於非外部數據類型的輸出參數,應當將“值傳遞”的方法改成“const 援用傳遞”,目標是進步效力。例如將void Func(A a) 改成void Func(const A &a)。
關於外部數據類型的輸出參數,不要將“值傳遞”的方法改成“const 援用傳遞”。不然既達不到進步效力的目標,又下降了函數的可懂得性。例如void Func(int x) 不該該改成void Func(const int &x)。
6、用const 潤飾函數的前往值
假如賜與“指針傳遞”方法的函數前往值加const 潤飾,那末函數前往值(即指針)的內容不克不及被修正,該前往值只能被賦給加const 潤飾的同類型指針。例如函數
const char * GetString(void);
以下語句將湧現編譯毛病:
char *str = GetString();
准確的用法是
const char *str = GetString();
假如函數前往值采取“值傳遞方法”,因為函數會把前往值復制到內部暫時的存儲單位中,加const 潤飾沒有任何價值。
例如不要把函數int GetInt(void) 寫成const int GetInt(void)。
同理不要把函數A GetA(void) 寫成const A GetA(void),個中A 為用戶自界說的數據類型。
假如前往值不是外部數據類型,將函數A GetA(void) 改寫為const A & GetA(void)切實其實能進步效力。但此時萬萬萬萬要當心,必定要弄清晰函數畢竟是想前往一個對象的“拷貝”照樣僅前往“別號”便可以了,不然法式會失足。
函數前往值采取“援用傳遞”的場所其實不多,這類方法普通只湧現在類的賦值函數中,目標是為了完成鏈式表達。
例如:
class A { A & operate = (const A &other); // 賦值函數 }; A a, b, c; // a, b, c 為A 的對象 a = b = c; // 正常的鏈式賦值 (a = b) = c; // 不正常的鏈式賦值,但正當 假如將賦值函數的前往值加const 潤飾,那末該前往值的內容不許可被修改。上例中,語句 a = b = c 依然准確,然則語句 (a = b) = c 則長短法的。
7、const 成員函數
任何不會修正數據成員(即函數中的變量)的函數都應當聲明為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; }
const 成員函數的聲明看起來怪怪的:const 症結字只能放在函數聲明的尾部,年夜概是由於其它處所都曾經被占用了。
關於Const函數的幾點規矩:
a. const對象只能拜訪const成員函數,而非const對象可以拜訪隨意率性的成員函數,包含const成員函數.
b. const對象的成員是弗成修正的,但是const對象經由過程指針保護的對象倒是可以修正的.
c. const成員函數弗成以修正對象的數據,不論對象能否具有const性質.它在編譯時,所以否修正成員數據為根據,停止檢討.
e. 但是加上mutable潤飾符的數據成員,關於任何情形下經由過程任何手腕都可修正,天然此時的const成員函數是可以修正它的。