轉自:http://blog.sina.com.cn/s/blog_4a65453001007vcx.htmlhtml
Const用法2006-07-13 15:24const的使用,認爲無關緊要,若是你開發的是一個簡單的系統,若是你一我的就能記住全部變量的意義,若是你一我的就能控制全部變量的使用位置,若是你的軟件發佈後不須要更多的維護工做,那麼你能夠忘記const,不然,const就是一個多個程序員之間溝通的強大工具。程序員
首先,const的最基本用法就是標識常量,使編譯器可以檢測出對該變量的不正確使用,也可使其餘的程序員使用此常量時,注意不能改變此常量。const出如今不一樣的位置有不一樣的意義。數組
1. const int number = 1; // 該變量爲常量,之後不能再對它賦值,因此這裏必須賦初值 2. const int * pNumber; // 指向常量的指針,(*pNumber)的值不能改變,但指針pNumber的值能夠改變 3. int * const pNumber = & number2; // 指向變量的常量指針,指針的值不能改變,因此必須先初始化 4. const int * const pNumber = & number; // 指向常量的常量指針,常量和指針的值都不能改變,因此必須先初始化 5. const int & number1 = number; // 指向常量的引用,C++中全部的引用都是常量引用,一個引用指向一個變量後,不能再改變值指向另外一個變量,因此不管是否說明,引用都是常量引用,必須在初始化時賦初值
其次,C++對函數的參數不區分輸入參數和輸出參數,並且常常因爲一個返回值不夠用,咱們會傳遞幾個引用或指針來接收返回值。咱們能夠用const來標明某參數爲輸入參數,函數內不會改變此參數的值,以下面一個函數:函數
bool CopyClass(Value & dest, const Value & src);
其中,Value爲用戶定義的類,CopyClass函數的功能爲拷貝src的內容到dest,src爲輸入參數,其值不能被改變,dest爲輸出參數,其餘程序員根據函數的定義,就能對函數的功能有個清晰的瞭解。工具
下面,讓咱們來看一下const的最後一種用法。請看下面CopyClass函數和Value類的實現:測試
class Value { public: int GetValue() { return _value; } private: int _value; } bool CopyClass(Value & dest, const Value & src) { int v = src.GetValue(); ………… }
請問:這段代碼能編譯經過嗎?測試一下,果真出現了編譯錯誤,錯誤出如今下面語句:int v = src.GetValue(); // 編譯錯誤,因爲src爲指向常量的引用,編譯器沒法肯定GetValue函數是否改變了src的內容,因此禁止調用.那麼,咱們只能放棄使用const標識輸入參數了嗎?不,咱們另有辦法,只要把GetValue函數的定義做以下改變便可:this
int GetValue() const { return _value; } /* const表示對傳遞給它的this指針指向的內容(即Value類)不作任何改變通過這樣的改變,上述代碼就能編譯經過了,其餘的程序員也能夠很快的瞭解到,該成員函數只是輸出類對象的內容,不會改變類對象的任何內容。*/
const主要是爲了程序的健壯型,減小程序出錯.
最基本的用法:spa
const int a=100; // b的內容不變,b只能是100也就是聲明一個int類型的常量(#define b =100) int const b=100; //和上面做用同樣
const指針和引用通常用在函數的參數中指針
int* m = &a; //出錯,常量只能用常指針 int c= 1; const int*pc = &c;//常指針可指向常量 const int* pa = &a; //指針指向的內容爲常量(就是b的值不變) int const *a = &b; //指針指向的內容爲常量(就是b的值不變)*p=3//error int* const a = &b; //指針爲常量,不能更改指針瞭如 a++但能夠改值*p=3;
從這能夠看出const放在*左側修飾的是指針的內容,const放在*右側修飾的是指針
自己.code
const引用的用法和指針同樣
int const & a=b; //和指針同樣 const int& a=b; //和指針同樣 //但沒有 int& const a=b 的用法由於引用不能作移位運算,但只是出個warning const int* const a = &b; //綜合應用,通常用來傳遞多維的數組 類如: char* init[] = {"Paris","in the","Spring"}; void fun(const int* const a){} fun(init)//保護參數不被修改 int A(int)const; //是常函數,只能用在類中,調用它的對象不能改改變成員值 const int A(); //返回的是常量,因此必須這麼調用 cosnt int a=A(); int A(const int); //參數不能改值,可用在任意函數 int A(const int*); int height() const;//常函數只能由常函數調用 int max(int,int) const; int Max = max(height(),height()); const int* pHeap = new int; delete pHeap; p = NULL;//出錯 //個人解決辦法是強制類型轉換 const int* pHeap = new int(1); delete (int*)pHeap; pHeap = NULL;