const的用法

轉自: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;
相關文章
相關標籤/搜索