c++ const變量
1.常變量
1.1.定義:在定義變量時(shí),如果加上關(guān)鍵字const,則變量的值在程序運(yùn)行期間不能改變。
1.2.在定義常變量時(shí)必須同時(shí)對(duì)它初始化(即指定其值),此后這的值不能再改變。如:
    const int a=3;  //正確
    如下面是錯(cuò)誤的:
    const int a;
    a=3;            //常變量不能被賦值

2.對(duì)象中的常數(shù)據(jù)成員
2.1.只能通過(guò)構(gòu)造函數(shù)的參數(shù)初始化表對(duì)常數(shù)據(jù)成員進(jìn)行初始化。
2.2.不能采用在構(gòu)造函數(shù)中對(duì)常數(shù)據(jù)成員賦初值的方法。

3.指向?qū)ο蟮某V羔槪?br>3.1.定義指向?qū)ο蟮某V羔樀囊话阈问綖?
    類名 * const 指針變量名;
    也可以在定義指針變量時(shí)使之初始化,如:
    Time * const ptr1=&t1;  //指定ptr1指向t1
3.2.注意點(diǎn):
    指向?qū)ο蟮某V羔樧兞康闹挡荒芨淖?即始終指向同一個(gè)對(duì)象,但可以改變其所指向?qū)ο?如t1)的值。
3.3.指向?qū)ο蟮某V羔樀氖褂脠?chǎng)合:
    如果想將一個(gè)指針變量固定地與一個(gè)對(duì)象相聯(lián)系(即該指針變量始終指向一個(gè)對(duì)象),可以將它指定為 const型指針變量。這樣可以防止誤操作,增加安全性。
3.4.往往常指針作為函數(shù)的形參,目的是不允許在函數(shù)執(zhí)行過(guò)程中改變指針變量的值,使其始終指向原來(lái)的對(duì)象。

4.指向常變量的指針變量
4.1.定義指向常變量的指針變量的一般形式為:
    const 類型名 *指針變量名; 例如:const char *ptr;
4.2.說(shuō)明:
    (1)如果一個(gè)變量已被聲明為常變量,只能用指向常變量的指針變量指向它,
     而不能用一般的(指向非const型變量的)指針變量去指向它。如
     const char c[]="boy";    //定義const型的char數(shù)組
     const char *p1;         //定義p1為指向const型的char變量的指針變量
     p1=c;                   //合法,p1指向常變量(char數(shù)組的首元素)
     char *p2=c;             //不合法,p2不是指向常變量的指針變量
    (2)指向常變量的指針變量除了可以指向常變量外,還可以指向未被聲明為const的變量。
     此時(shí)不能通過(guò)此變量改變?cè)撟兞康闹怠H?
     char c1='a';   //定義字符變量c1,它并未聲明為const
     const char *p; //定義了一個(gè)指向常變量的指針變量p
     p=&c1;         //使p指向字符變量c1
     *p='b';        //非法,不能通過(guò)p改變變量c1的值
     c1='b';        //合法,沒(méi)有通過(guò)p訪問(wèn)c1,c1不是常變量
    (3)如果函數(shù)的形參是指向非const型變量的指針,實(shí)參只能用指向非const變量的指針,
     而不能用指向const變量的指針,這樣,在執(zhí)行函數(shù)的過(guò)程中可以改變形參指針變量所指向
     的變量(也就是實(shí)參指針?biāo)赶虻淖兞?的值。
     如果函數(shù)的形參是指向const型變量的指針,在執(zhí)行函數(shù)過(guò)程中顯然不能改變指針變量所
     指向的變量的值,因此允許實(shí)參指向const變量的指針,或指向非const變量的指針。如:
     const char str[]="boy"; //str是const型數(shù)組名
     void fun(char *ptr);    //函數(shù)fun的形參是指向非const型變量的指針
     fun(str);           //調(diào)用fun函數(shù),實(shí)參是const變量的地址,非法
    (4)總結(jié):指向常變量的指針變量可以指向const和非const型的變量,而指向非const型變量
     的指針變量只能指向非const的變量。

5.指向常對(duì)象的指針變量
5.1.指向常變量的指針變量,指向常對(duì)象的指針變量的概念和使用是與此類似的,只要將"變量"
    換成"對(duì)象"即可。
5.2.如果一個(gè)對(duì)象已被聲明為常對(duì)象,只能用指向常對(duì)象的指針變量指向它,
     而不能用一般的(指向非const型對(duì)象的)指針變量去指向它。
5.3.如果定義了一個(gè)指向常對(duì)象的指針變量,并使它指向一個(gè)非const的對(duì)象,則其指向的對(duì)象
    是不能通過(guò)指針來(lái)改變的。如:
    Time t1(10,12,15);   //定義Time類對(duì)象t1,它是非const型對(duì)象
    const Time *p=&t1;  //定義p是指向常對(duì)象的指針變量,并指向t1
    t1.hour=18;         //合法,t1不是常變量
    (*p).hour=18;       //非法,不能通過(guò)指針變量改變t1的值
    注:如果希望在任何情況下t1的值都不能改變,則應(yīng)把它定義為const型對(duì)象,如:
    const Time t1(10,12,15);
5.4.注意指向常對(duì)象的指針變量與指向?qū)ο蟮某V羔樧兞吭谛问缴虾妥饔蒙系膮^(qū)別.
    Time *const p;   //指向?qū)ο蟮某V羔樧兞?br>    const Time *p;   //指向常對(duì)象的指針變量
5.5 指向常對(duì)象的指針常用于函數(shù)的形能,目的是在保護(hù)形參指針?biāo)赶虻膶?duì)象,使
    它在函數(shù)執(zhí)行過(guò)程中不被修改。
5.6.當(dāng)希望在調(diào)用函數(shù)時(shí)對(duì)象的值不被修改,就應(yīng)當(dāng)把形能定義為指向常對(duì)象的指針變量,
    同時(shí)用對(duì)象的地址作實(shí)參(對(duì)象可以是const或非const型)。
    如果要求該對(duì)象不僅在調(diào)用函數(shù)過(guò)程中不被改變,而且要求它在程序執(zhí)行過(guò)程中都不改變,則應(yīng)把這 定義為const型。
5.7.如果定義了一個(gè)指向常對(duì)象的指針變量,是不能通過(guò)它改變所指向的對(duì)象的值的,但是指針變量本身的值是可以改變的。如:
    const Time *p=&t1; //定義指向常對(duì)象的指針變量p,并指向?qū)ο髏1
    p=&t2;             //p改為指向t2,合法

6.對(duì)象的常引用
6.1.如果不希望在函數(shù)中修改實(shí)參t1的值,可以把引用變量t聲明為const(常引用),函數(shù)原型為:
    void fun(const Time &t);
    則在函數(shù)中不能改變t的值,也就是不能改變其對(duì)應(yīng)的實(shí)參t1的值。

7.在C++面向?qū)ο蟪绦蛟O(shè)計(jì)中,經(jīng)常用常指針和常引用作函數(shù)參數(shù),這樣既能保證數(shù)據(jù)安全,使數(shù)據(jù)不能被隨意修改,在調(diào)用函數(shù)時(shí)又不必實(shí)參的拷貝。用常指針和常引用作函數(shù)參數(shù),可以提高程序運(yùn)行效率。
8.用常對(duì)象作函數(shù)參數(shù)較少,因其內(nèi)存開銷開。

9.以上參考譚教授<C++程序設(shè)計(jì)>教程,在些感謝!

    加速度 February.24.2010

轉(zhuǎn)自:http://blog.21ic.com/user1/6121/archives/2010/66976.html