1.const的用法:
(1)定義常量
(2)修飾函式的引數
(3)修飾函式的返回值
(4)修飾函式的定義體
1.將限定符宣告為唯讀,修飾普通型別的變數。
在型別前/後加上關鍵字const,該變數必須被初始化,否則編譯錯誤;該變數不能被重新賦值,否則也編譯錯誤。舉例:
const int i=100; //ok
const int i; //error
int k=0;
i=k; //error i被定義為乙個常量 不可以再對i進行賦值 其值不允許修改
k=i; //ok 可以將i賦值給b,
接著看下面**:
int main()
(2)值傳遞的const修飾傳遞,一般情況不需要const修飾,因為函式會自動產生臨時變數賦值實參值。
#includeusing namespace std;
void cpf(const int a)
{ cout<(3)而對於自定義資料型別(非內部資料型別)的輸入引數,為了提高速度和效率,應使用「const + 引用傳遞」 代替值傳遞。
例如:將void test(a a)改為 void test(const a &a)
因為函式體內將產生a型別的臨時物件用於複製引數a,而臨時物件的構造、複製、析構過程都將耗費時間;「引用傳遞」只是借用一下引數的別名而已,不需要產生臨時物件。
(4)事實上對於內建型資料型別的輸入引數(如以上例子中的int型別),不要將「值傳遞」的方式改為「引用傳遞」,因為用引用傳遞不會使速度更快。即達不到提高效率的目的,又降低了函式的可理解性。
例如: void fun(int x) 改為 void fun(const int &x)
因為內部資料型別的引數不存在構造,析構的過程,而複製也比較快,「值傳遞」和「引用傳遞」的效率幾乎相當。
3.用const修飾函式的返回值
(1)如果給以 「指標傳遞」 的方式的函式返回值加const修飾,那麼函式返回值(即指標)的內容不能被修改,該返回值只能被賦給加const修飾的同型別指標。
例如:函式const char *getstring(void);
正確的是 :const char *str=getstring(); //寫成 char *str=getstring(); 將出現編譯錯誤
(2)如果函式返回值採用「值傳遞」方式,由於函式會把返回值複製到臨時的外部的儲存單元上,所以加const沒有任何價值。
例如: 不要把函式 int getlnt(void) 寫成 const int getlnt(void).
(3) 函式返回值採用「引用傳遞」的場合並不多,這種方式一般都只出現在類的賦值函式
4.const修飾指標變數
const修飾指標變數有三種情況:
a: const修飾指標指向的內容,則內容為不可變數
const int *p =8;
//指標指向的內容8 不可改變,簡稱左定值,因為const位於 *號的左邊
b: const修飾的是指標,則指標為不可變數
int a =8;
int * const p=&a;
*p=9; // ok 對於const指標p 其指向的記憶體位址不能夠被改變,但是其內容可以改變,簡稱 右定向,因為const 位於*號的右邊
int b=7;
p=&b; //no
c: const修飾的是指標和指標指向的內容,則指標和指標指向的內容都是不可變數。
int a=8;
const int * const p=&a;
//const 不僅修飾指標p 還修飾p指向的內容,都已經固定,不可改變
對於a,b,c三種情況,根據const位於 *號位置不同,總結為:「左定值、右定向、const修飾不變數」 const用法詳解
物件導向是c 的重要特性.但是c 在c的基礎上新增加的幾點優化也是很耀眼的 就const直接可以取代c中的 define 以下幾點很重要,學不好後果也也很嚴重 1.const常量,如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安...
const 用法詳解
物件導向是c 的重要特性.但是c 在c的基礎上新增加的幾點優化也是很耀眼的 就const直接可以取代c中的 define 以下幾點很重要,學不好後果也也很嚴重 1.const常量,如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安...
const用法詳解
看 到const 關鍵字,很多人想到的可能是 const 常量,其實關鍵字 const 並不能把變數變成常量!在乙個符號前加上 const 限定符只是表示這個符號 不能被賦值。也就是它的值對於這個符號來說是唯讀的,但它並不能防止通過程式的內部 甚至是外部 的方法來修改這個值 c專家程式設計 p21 ...