c++ const變量
1.常變量
1.1.定義:在定義變量時(shí),如果加上關(guān)鍵字const,則變量的值在程序運(yùn)行期間不能改變。
1.2.在定義常變量時(shí)必須同時(shí)對它初始化(即指定其值),此后這的值不能再改變。如:
const int a=3; //正確
如下面是錯(cuò)誤的:
const int a;
a=3; //常變量不能被賦值
2.對象中的常數(shù)據(jù)成員
2.1.只能通過構(gòu)造函數(shù)的參數(shù)初始化表對常數(shù)據(jù)成員進(jìn)行初始化。
2.2.不能采用在構(gòu)造函數(shù)中對常數(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è)對象,但可以改變其所指向?qū)ο?如t1)的值。
3.3.指向?qū)ο蟮某V羔樀氖褂脠龊?
如果想將一個(gè)指針變量固定地與一個(gè)對象相聯(lián)系(即該指針變量始終指向一個(gè)對象),可以將它指定為 const型指針變量。這樣可以防止誤操作,增加安全性。
3.4.往往常指針作為函數(shù)的形參,目的是不允許在函數(shù)執(zhí)行過程中改變指針變量的值,使其始終指向原來的對象。
4.指向常變量的指針變量
4.1.定義指向常變量的指針變量的一般形式為:
const 類型名 *指針變量名; 例如:const char *ptr;
4.2.說明:
(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í)不能通過此變量改變該變量的值。如:
char c1='a'; //定義字符變量c1,它并未聲明為const
const char *p; //定義了一個(gè)指向常變量的指針變量p
p=&c1; //使p指向字符變量c1
*p='b'; //非法,不能通過p改變變量c1的值
c1='b'; //合法,沒有通過p訪問c1,c1不是常變量
(3)如果函數(shù)的形參是指向非const型變量的指針,實(shí)參只能用指向非const變量的指針,
而不能用指向const變量的指針,這樣,在執(zhí)行函數(shù)的過程中可以改變形參指針變量所指向
的變量(也就是實(shí)參指針?biāo)赶虻淖兞?的值。
如果函數(shù)的形參是指向const型變量的指針,在執(zhí)行函數(shù)過程中顯然不能改變指針變量所
指向的變量的值,因此允許實(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.指向常對象的指針變量
5.1.指向常變量的指針變量,指向常對象的指針變量的概念和使用是與此類似的,只要將"變量"
換成"對象"即可。
5.2.如果一個(gè)對象已被聲明為常對象,只能用指向常對象的指針變量指向它,
而不能用一般的(指向非const型對象的)指針變量去指向它。
5.3.如果定義了一個(gè)指向常對象的指針變量,并使它指向一個(gè)非const的對象,則其指向的對象
是不能通過指針來改變的。如:
Time t1(10,12,15); //定義Time類對象t1,它是非const型對象
const Time *p=&t1; //定義p是指向常對象的指針變量,并指向t1
t1.hour=18; //合法,t1不是常變量
(*p).hour=18; //非法,不能通過指針變量改變t1的值
注:如果希望在任何情況下t1的值都不能改變,則應(yīng)把它定義為const型對象,如:
const Time t1(10,12,15);
5.4.注意指向常對象的指針變量與指向?qū)ο蟮某V羔樧兞吭谛问缴虾妥饔蒙系膮^(qū)別.
Time *const p; //指向?qū)ο蟮某V羔樧兞?br> const Time *p; //指向常對象的指針變量
5.5 指向常對象的指針常用于函數(shù)的形能,目的是在保護(hù)形參指針?biāo)赶虻膶ο?使
它在函數(shù)執(zhí)行過程中不被修改。
5.6.當(dāng)希望在調(diào)用函數(shù)時(shí)對象的值不被修改,就應(yīng)當(dāng)把形能定義為指向常對象的指針變量,
同時(shí)用對象的地址作實(shí)參(對象可以是const或非const型)。
如果要求該對象不僅在調(diào)用函數(shù)過程中不被改變,而且要求它在程序執(zhí)行過程中都不改變,則應(yīng)把這 定義為const型。
5.7.如果定義了一個(gè)指向常對象的指針變量,是不能通過它改變所指向的對象的值的,但是指針變量本身的值是可以改變的。如:
const Time *p=&t1; //定義指向常對象的指針變量p,并指向?qū)ο髏1
p=&t2; //p改為指向t2,合法
6.對象的常引用
6.1.如果不希望在函數(shù)中修改實(shí)參t1的值,可以把引用變量t聲明為const(常引用),函數(shù)原型為:
void fun(const Time &t);
則在函數(shù)中不能改變t的值,也就是不能改變其對應(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.用常對象作函數(shù)參數(shù)較少,因其內(nèi)存開銷開。
9.以上參考譚教授<C++程序設(shè)計(jì)>教程,在些感謝!
加速度 February.24.2010
轉(zhuǎn)自:http://blog.21ic.com/user1/6121/archives/2010/66976.html