這幾天看了c++程式設計思想,想把const的用法給總結一下:
const的幾種用法如下:
一.用做值替代.
1).用來定義常量如:const int a = 10;
二.指標.
1).指 const char *p = "hello"; char const *p = "hello";這兩種結果是一樣的,只是形式上不一樣.
const 資料,非const 指標.
2).指 char* const p= "hello"; const 指標,非const 資料.
3).指 const char* const p = "hello"; const 指標及const 資料.
三.函式引數及返回值.
1).傳遞const值.例如:void f(const int i)
2).返回const值.例如:const int f()
3).傳遞與返回位址.void f(const int& i) void f(const int* i) const int& f() .下面有一條得記住了
// 寫此函式的第乙個錯誤方法 inline const rational& operator*(const rational& lhs, const rational& rhs)
它返回的是乙個區域性物件的引用.返回乙個區域性物件的引用。它的問題在於,區域性物件 ----- 顧名思義 ---- 僅僅是區域性的。也就是說,區域性物件是在被定義時建立,在離開生命空間時被銷毀的。所謂生命空間,是指它們所在的函式體。當函式返回時,程式的控制離開了這個空間,所以函式內部所有的區域性物件被自動銷毀。因此,如果返回區域性物件的引用,那個區域性物件其實已經在函式呼叫者使用它之前被銷毀了。
區域性物件result在剛進入operator*函式體時就被建立。但是,所有的區域性物件在離開它們所在的空間時都要被自動銷毀。具體到這個例子來說,result是在執行return語句後離開它所在的空間的。所以,如果這樣寫:rational two = 2; rational four = two * two; // 同operator*(two, two)
函式呼叫時將發生如下事件:
1). 區域性物件result被建立。 2). 初始化乙個引用,使之成為result的另乙個名字;這個引用先放在另一邊,留做operator*的返回值。 3). 區域性物件result被銷毀,它在堆疊所佔的空間可被本程式其它部分或其他程式使用。 4). 用步驟2中的引用初始化物件four。
一切都很正常,直到第4步才產生了錯誤,借用高科技界的話來說,產生了"乙個巨大的錯誤"。因為,第2步被初始化的引用在第3步結束時指向的不再是乙個有效的物件,所以物件four的初始化結果完全是不可確定的。教訓很明顯:別返回乙個區域性物件的引用。
四.類.
1).類裡面定義的const.例如:class fred};
2).const的物件.例如:const int i =1; const blob b(2); blob是乙個類.
3).const的成員函式. 例如:class x; int f() const };
c 中的const總結
1.const用來定義符號常量時要注意 const 型別 name value 型別 const name value 符號常量宣告時就要賦初值,而且在程式中不能改變它的值 2.const定義常引用 const 型別 引用名 比如 void display const int r 常引用做形參時,所...
c 中對const的總結
c 中const總結 對於基本宣告 1.const int r 100 標準const變數宣告加初始化,因為預設內部連線所以必須被初始化,其作用域為此檔案,編譯器經過型別檢查後直接用100在編譯時替換 2.extend const int r 100 將const改為外部連線,作用於擴大至全域性,編...
c 中對const的總結
c 中const總結 對於基本宣告 1.const int r 100 標準const變數宣告加初始化,因為預設內部連線所以必須被初始化,其作用域為此檔案,編譯器經過型別檢查後直接用100在編譯時替換 2.extend const int r 100 將const改為外部連線,作用於擴大至全域性,編...