2013年6月22日 星期六

[轉錄] C++學習筆記(常數 Const)

常數(Const)

const為Constant的縮寫,是用一個變數來代表一個常使用的物件。
?
1
int pi = 3.14;
假設我們要設定圓周率pi為3.14,如果用上述方式設定的話,pi是可以變動的!!
?
1
2
pi=3.1;
pi=3.1415;
這對於程式來說是相當危險的事情,牽一髮動全身!
因此我們會在 pi宣告前加個「」讓他沒辦法更動,就是「const」
下面段意思是,const 一個 int p = 3.14 的變數
?
1
const int pi = 3.14;
下面段意思是,const  p = 3.14 的變數,而這變數是個int,兩著有些許不同,但效果一樣
?
1
int const pi = 3.14;

Const還可以被用來宣告函數,其用法相當多種,修飾不同的東西。

1.放在函數最後面(在類別宣告中)
其函數在執行過程中便不能修改資料成員,語法如下:
回傳資料型別  函數名稱(引數) const {函式內容}
?
1
int f1(int x) const {/...../}
2.放在函數最前面
其回傳值將是const,語法如下:
const 回傳資料型別  函數名稱(引數)
?
1
const int f2(int x)  {/...../}
3.放在引數變數前
其引數將變為const,語法如下:
回傳資料型別  函數名稱(引數型別 const 引數)
?
1
int f3(int const x)  {/...../}
4.放在引數前,而引數指標變數
其指標變數所指示的變數將變為const,語法如下:
回傳資料型別  函數名稱(引數型別 const *引數)
?
1
int f4(int const *x)  {/...../}
或是
回傳資料型別  函數名稱(const 引數型別  *引數)
?
1
int f4(const int *x)  {/...../}
5.放在引數前,而引述為指標變數前
其參考變數所參考的變數將變為const,語法如下:
回傳資料型別  函數名稱(引數型別 const &引數)
?
1
int f5(int const &x)  {/...../}
6.引數設const,再設為指標變數
其指標引數將變為const,語法如下:
回傳資料型別  函數名稱(引數型別 *const 引數)
?
1
int f6(int *const x)  {/...../}
7.引數設const,再設為指標變數,再加上const
其指標引數將變為const,且所指引的變數將為const,語法如下:
回傳資料型別  函數名稱(引數型別 *const 引數)
?
1
int f7(const int *const x)  {/...../}

總結:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class Book{
    private:
        //資料成員
        int c ;
        string name;
  
public:
    Book(){
        c=0;
    }
  
    int f1(int x) const {
        c = 1 ;//錯誤!! set_name函式為const函式,不可更動資料成員
    }
  
    const int f2(int x){
        x++;
        c++;
        return c;
    }
  
    int f3(int const x){
        x++; //錯誤!! x為const變數
        c++;
        return c;
    }
  
    int f4(int const *x){
        (*x)++; //錯誤,因為原本指向的變數被設定為const了
        *x++;   //正確,意思是*(x++),只是改變x的記憶體位置,再指定到變數
        return c;
    }
  
    int f5(int const &x){
        x++;  //錯誤!x所參考的變數已經是const,x也是個const
        return c;
    }
  
    int f6(int *const x){
        (*x)++; //正確,x是const,但x所指引的變數並非const,可對其做++動作 
        *x++;   //錯誤!意思是*(x++),x已經是const,所以不可更動記憶體位置
        return c;
    }
  
    int f7(const int *const x){
        (*x)++;  //錯誤!x所參考的變數已經是const,x也是個const
        *x++;    //錯誤!意思是*(x++),x已經是const
        return c;
    }
  
};
參考文獻:
1. http://csie-tw.blogspot.com/2010/03/c-constconst-pointer-pointer-to-const.html
2. C++ primer 4/e 中文版 侯傑老師譯
3. Visual C++ 2005 ecpress 入門進階 文魁資訊

沒有留言: