(一) const 的一件奇妙事情是,它容許你指定一個語義約束(也就是指定一個「不應被改動」的對象),而編譯器會強制實施這項約束。關鍵字 const 能夠用它在 classes 外部修飾 gloabl 或 namespace 做用域中的常量,或修飾文件,函數,或區塊做用域中被聲明爲 static 的對象。也能夠修飾 classes 內部的 static 和 non-static 成員變量。對於指針,能夠指出指針自身,指針所指物,或二者都是(都不是)const;安全
char greeting[] = "hello";函數
char *p = greeting;spa
const char *p = greeting; //const data, non-const pointer指針
char* const p = greeting; //const pointer, non-const data對象
const char* const p = greeting; // const data, const pointer接口
若是關鍵字 const 出如今星號左邊,表示被指物是常量;若是出如今星號右邊,表示指針自身是常量;若是出如今星號兩邊,表示被指物和指針二者都是常量。若是被指物是一個常量,則關鍵字 const 在星號以前或以後的意義是相同的。作用域
STL迭代器是以指針爲根據塑模出來的,因此迭代器的做用就像一個 T* 指針。聲明迭代器爲 const 就像聲明指針爲 const 同樣,表示這個迭代器不得指向不一樣的東西,但它所指的東西的值是能夠改變的。編譯器
const 最具威力的用法是面對函數聲明時的應用。在一個函數聲明式內,const能夠和函數返回值,各參數,函數自身產生關聯。令函數返回一個常量值,每每能夠下降因客戶錯誤而形成的意外,而又不至於放棄安全性和高效性。例如:io
class Rational{...};編譯
const Rational operator * (const Rational &lhs, const Rational &rhs);
Rational a, b, c;
(a * b) = c; //error 在 a * b 的結果上調用 operator *
(二)const 成員函數:
將 const 實施於成員函數的目的,是爲了確認該成員函數能夠做用於 const 對象身上。這一類成員函數之因此重要,基於兩個理由。① 它們使 class 接口比較容易理解。這是由於,得知哪一個函數能夠改動對象內容而哪一個函數不行是很重要的。② 它們使「操做 const 對象」成爲可能。改善C++ 程序效率的一個根本方法是以引用傳遞的方式傳遞對象,而此技術可行的前提是,咱們有const 成員函數來處理取得的 const 對象。
注意:
1)把一個 const 對象的地址賦給一個普通的,非 const 對象的指針也會致使編譯時的錯誤
2)容許把非 const 對象的地址賦給指向 const 對象的指針 ,但不能使用指向 const 對象的指針修改基礎對象
double dval = 4.12;
const double *cptr = &dval;
*cptr = 3.14159; // error,cptr 是一個指向 const 對象的指針。
3)在實際的程序中,指向 const 的指針經常使用做函數的形參。將形參定義爲指向 const 的指針,以此確保傳遞給函數的實際對象在函數中不由於形參而被修改。