先發個標題,明天再碼 ...
看完了c++ primer的基礎篇,對const還是有點陌生,在這裡小小地總結一下吧。
1) const與變數
在變數的定義前加上const修飾符即可完成const對象的創建。
const int val = 5;
const變數的值不能改變。
val = 5; //error:assignment of read-only variable 'val'
需要註意的是,const變數必須初始化,因為一旦定義了const變數,其值便無法改變,故必須有初始值。
const int val2; //error:uninitialized const 'val2'
預設狀態下,const對象僅在文件內有效
//file1.cc
const int val3 = 5;
int val4 = 6;
//file2.cc
//...
extern const int val3;
extern int val4;
cout << val3 << endl; //error:undefined reference to 'val3'
cout << val4 << endl; //ok
如果需要多個文件共用const變數,則只需在其聲明和定義前加上關鍵字extern即可。
//file1.cc
extern const int val3 = 5;
int val4 = 6;
//file2.cc
//...
extern const int val3;
extern int val4;
cout << val3 << endl; //ok
cout << val4 << endl; //ok
2) const和指針
const double pi = 3.14; //constant value
double *ptr = π //error
const double *cptr = π //ok
*cptr = 3.15; //error
double dval = 3.14;
cptr = &dval; //ok
*cptr = 3.15; //error
int errNumb = 0;
int *const curErr = &errNumb; //const pointer
const double *const pip = π
頂層const表示指針本身是個常量
底層const表示指針所指的對象是一個常量
3) const與函數
void fcn(const int i){//...}
//fcn能夠讀取i,但不能修改i
函數設計時,對於較複雜的非內置類型應該儘量使用常量引用,值傳遞會造成不必要的浪費。
void func(string&);
const string str;
func(str);//error
func("something")//error
如上例,如果只是想使用字元串的值,則形參類型應為const string&,否則會限制所能接受形參的類型,並會給人一種誤導,即函數可以修改它的實參的值。
4) const與類
使用const限定符修飾類的對象,則在該對象的整個生命周期中,其數據成員永遠不會被更改。
const class_name object;
在類的函數成員聲明中,如果在參數列表後面加上const,就說明這個函數不能修改對象的任何數據成員(mutable成員除外,其值總是能夠被修改)。const實際上修飾隱式傳入函數的this指針。
struct A {
void func() const { val = 0; } //error
private:
int val;
}