const:大致意思是「我承諾不改變這個值」。主要用於說明介面,這樣在把變數傳入函式時就不必擔心變數會在函式內被改變。編譯器負責確認並執行const的承諾。或者可以說在當前作用域內值不發生改變。
const
的語法雖然變化多端,但並不高深莫測,如果乙個被指物是常量,const
可以寫在型別之前,也可以寫在型別之後,這兩種寫法的意義是相同的。
//下面兩行**是等同的
const
int a =5;
//設定a為常量5
intconst b =6;
//設定b為常量6
當const與指標一起使用時,又有些不同
char p=
"hello"
;char
* p1 = p;
//非常量指標,非常量資料
const
char
* p1 = p;
//非常量指標,常量資料
char
const
* p1 = p;
//同上
char
*const p1 = p;
//常量指標,非常量資料
const
char
*const p1 = p;
//常量指標,常量資料
在程式中應盡量使用常量代替數值,不但可以方便閱讀,也方便了程式的維護。程式中在多個地方使用同乙個常量,則需要改變該常量時,只需要修改乙個符號即可。
#define pi 3.14
#define 是預處理方法,其不被視為語言的一部分。在編譯器處理源**時,其定義的pi
就已經被3.14替代,於是當你運用此常量但獲得乙個編譯錯誤資訊時,可能會帶來困惑,因為這個錯誤資訊也許會提到3.14,而不是pi
。
使用const可以解決這個問題:
const
double pi =
3.14
;
pi會作為乙個語言被編譯器看到,因此當出現錯誤時,其會被編譯器指出。
指標和const的常用用法
int age =13;
const
int* pt =
&age;
//表示不能通過 *pt 改變age的值
cout <<
*pt << endl;
//輸出結果應該為13
//*pt = 14; //是無效的,在宣告pt時,const的作用就是防止使用*pt改變其所指向的值
age =14;
//有效
cout <<
*pt << endl;
//輸出結果應該為14
int year =
2020
;pt =
&year;
//有效 此時pt是year的位址,但是此時不能使用*pt改變year的值
cout <<
*pt << endl;
//輸出結果應該為2020
int age =13;
int*
const pt =
&age;
//表示指標pt的值只能是age的地
cout <<
*pt << endl;
//輸出結果為13
*pt =14;
//是有效的
cout <<
*pt << endl;
//輸出結果為14
int year =
2020
;pt =
&year;
//無效 pt的值是不能改變的
當函式的引數是為了進行值傳遞且不對其進行修改時,並且其為較大的結構,類物件,或者陣列時,我們通常使用const引用或者const指標,其目的是為了提高程式的效率,這樣可以節省複製結構所需要的時間和空間。
void
fun(
const a *in)
;//修飾指標型傳入引數,表示在函式內部in指向的值是不能被修改的
void
fun(
const a &in)
;//修飾引用型傳入引數,表示in引用的值在函式內部是不能被修改的
當使用const修飾函式的傳入引數時,可以使函式能夠處理const 和非const引數,否則只能接受非const資料。
可以阻止使用者修改返回值。返回值也要相應的賦給乙個常量或常指標。多用於操作符過載。
const rational operator
* (const rational& lhs,const rational& rhs)
;
當我們為了改善c++程式效率時,使用用法3傳遞類物件時,物件會被宣告成const物件,一旦乙個物件被宣告成為乙個const物件後,那麼就只能訪問它的const成員函式,不能訪問非const函式(而非const物件可以訪問任意的成員函式,包括const成員函式)
const成員函式的好處:
第一,它們使class介面比較容易被理解。這是因為,得知哪個函式可以改動物件內容而哪個函式不行。
第二,它們使「操作const物件」成為可能。
例:
class
point
intgetx()
const
intgety()
const
void
setx
(int x)
private
:int x, y;};
void
display
(const point p1)
在常量成員函式內,是不允許去改變類內的資料成員的值。
例:
class
point
intgetx()
const
private
:int x, y;
};
const 修飾乙個陣列時,該陣列內的值是不可以被改變的;
const
int array[2]
=;//宣告array為const陣列
array[0]
=3;//無效,不能修改陣列內的值
int* p = array;
//無效,array的值不能賦值給非const型實體
const修飾引用時,表示不能通過這個引用改變原來的資料
int age =10;
const
int& ref = age;
//宣告ref為乙個const引用
ref =9;
//無效
age =9;
//有效
const關鍵字總結c
const成員函式只能呼叫const成員函式 const成員函式中不能改變成員變數的值,但是可以訪問所有變數 非const函式可以呼叫const函式 因為非const可能會修改屬性值,所以在const物件情況下,非const方法不能被呼叫,只能呼叫const方法 const函式可被非const過載,...
const關鍵字總結
這裡會呼叫string類的預設建構函式初始化陣列元素。const int cur 這裡的cur是乙個指向int型別的const物件的指標,const先頂了cur指向的物件的型別,而並非cur本身,所以cur不是const的 const double cur const double pur 1.2 ...
const關鍵字總結
被const修飾的變數是不能改變的 const修飾變數時,必須在宣告變數的同時給出初始化 類中的const成員變數不一樣 定義為變數本身是乙個常量,因此對一切的內建型別常量而言,所有的const都是頂層const 對指標來說,常量指標是頂層const,對於引用則沒有頂層const的概念。只在指標和引...