(1)const變量 非 const 變量默認為extern。要使 const 變量能夠在其他的源 文件中訪問,必須地指定它為 extern。否則會報錯:error LNK2001: 無法解析的外部符號"int const BUF_SIZE"(?BUF_SIZE@@3HB)
(2)const 限定符既可以放在類型前也可以放在類型後,如下s1和s2類型相同: string const s1; const string s2; (3)指針和const const的鑒別:在*左邊或右邊畫一道豎線,看是否和const在一起,和const在一起就是不可以改變的。const void *p1 不是p1不能改變,而是p1所指向的內容不可以改變。 如果const出現在*號左邊,修飾的是指針指向的對象,被指對象是常量,即對象不可修改。如果const出現在*號右邊,修飾的是指針本身,指針本身是常量,即指針不能再指向別的內存。如果const出現在*號兩邊,則指針和被指對象均是常量。 (3.1)指向const對象的指針 為了保證如果指針指向const對象,則不允許用指針來改變其所指的const值這個特性,C++ 語言強制要求指向const對象的指針也必須具有const特性。 把一個 const 對象的地址賦給一個普通的、非 const 對象的指針也會導致編譯時的錯誤: const double pi = 3.14; double *ptr = π // error:ptr is a plain pointer const double *cptr = π //ok: cptr is a pointer to const 不能使用 void* 指針保存const 對象的地址,而必須使用 const void* 類型的指針保存 const 對象的地址: const int universe = 42; const void *cpv = &universe;// ok: cpv is const void *pv = &universe; // error:universe is const 允許把非const對象的地址賦給指向const對象的指針,例如: double dval = 3.14; // dval is adouble; its value can be changed const double *cptr = &dval;// ok: but can't change dval through cptr 盡管所指的對象dval並非const,但仍不能使用cptr修改該對象的值,任何企圖通過指針cptr修改其值的行為都會導致編譯時的錯誤。本質上來說,由於沒有方法分辯cptr所指的對象是否為const,系統會把它所指的所有對象都視為const。不能使用指向const對象的指針修改基礎對象,可用其他方法修改const指針所指向的非const對象的值。 不能保證指向const的指針所指對象的值一定不可修改。可以把指向const的指針理解為“自以為指向const的指針”。 在實際的程序中,指向const的指針常用作函數的形參。將形參定義為指向const的指針,以此確保傳遞給函數的實際對象在函數中不因為形參而被修改。 (3.2)const 指針 本身的值不能修改 int errNumb = 0; int *const curErr = &errNumb;// curErr is a constant pointer 我們可以從右向左把上述定義語句讀作“curErr是指向int型對象的const 指針”。與其他const量一樣,const指針的值不能修改,這就意味著不能使curErr指向其他對象。任何企圖給const指針賦值的行為都會導致編譯時的錯誤。與任何const量一樣,const指針也必須在定義時初始化。 指針本身是const的事實並沒有說明是否能使用該指針修改它所指向對象的值。指針所指對象的值能否修改完全取決於該對象的類型。 (3.3)指向const 對象的 const 指針 const double pi = 3.14159; const double *const pi_ptr =π 本例中,既不能修改 pi_ptr 所指向對象的值,也不允許修改該指針的指向(即pi_ptr中存放的地址值)。可從右向左閱讀上述聲明語句:“pi_ptr 首先是一個 const 指針,指向 double類型的const對象”。 (4)const在函數中的應用 (4.1)const類型的形參 非引用形參時:形參與const形參等價。 是否將形參定義為 const。這種差異並不影響傳遞至函數的對象;其原因在於實參傳遞的方式。復制形參時並不考慮形參是否為const——函數操縱的只是副本。函數無法修改實參。既可將const對象傳遞給const形參,也可傳遞給非const 形參,這兩種形參並無本質區別。 有const引用形參的函數與有非const 引用形參的函數是不同的。類似地,如果函數帶有指向const類型的指針形參,則與帶有指向相同類型的非const對象的指針形參的函數不相同。 僅當形參是引用或指針時,形參是否為const才有影響。 (4.2)利用const引用避免復制,使用引用形參,函數可以直接訪問實參對象,而無須復制它。 (4.3)非引用形參時,不能基於形參是否為const來實現函數的重載。 f(int *); f(int *const); // redeclaration 此時,const 用於修改指針本身,而不是修飾指針所指向的類型。在上述兩種情況中,都復制了指針,指針本身是否為const並沒有帶來區別。當形參以副本傳遞時,不能基於形參是否為const來實現重載。