程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++編程中的const症結字罕見用法總結

C++編程中的const症結字罕見用法總結

編輯:關於C++

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成員函數是可以修正它的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved