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,
(2)值傳遞的const修飾傳遞,一般情況不需要const修飾,因為函式會自動產生臨時變數賦值實參值。int main()
b: 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位於 *號的左邊
c: const修飾的是指標和指標指向的內容,則指標和指標指向的內容都是不可變數。int a =8;
int * const p=&a;
*p=9; // ok 對於const指標p 其指向的記憶體位址不能夠被改變,但是其內容可以改變,簡稱 右定向,因為const 位於*號的右邊
int b=7;
p=&b; //no
對於a,b,c三種情況,根據const位於 *號位置不同,總結為:「左定值、右定向、const修飾不變數」int a=8;
const int * const p=&a;
//const 不僅修飾指標p 還修飾p指向的內容,都已經固定,不可改變
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 ...