const的理解和用法
const是一個(gè)C語(yǔ)言(ANSI C)的關(guān)鍵字,具有著舉足輕重的地位。它限定一個(gè)變量不允許被改變,產(chǎn)生靜態(tài)作用。使用const在一定程度上可以提高程序的安全性和可靠性。下面是小編精心整理的const的理解和用法,希望對(duì)大家有所幫助。
一、關(guān)于const的具體定義:
——個(gè)人感覺(jué)很難對(duì)它下一個(gè)標(biāo)準(zhǔn)的定義,因?yàn)榈挠梅ê莒`活,似乎對(duì)它定義后總無(wú)法讓人能夠明白它的意思,而且容易讓人產(chǎn)生誤解(也許是偶水平太菜了)。例如,把它有定義:一個(gè)能夠讓變量變成無(wú)法修改的常量的關(guān)鍵字。那么,這樣的話,就可能讓人誤解為只要有const在定義變量里面,那變量就無(wú)論怎樣都無(wú)法修改。這樣的理解是很片面的(下面用法方面將對(duì)這問(wèn)題做探討)。因此,本人在此不敢對(duì)它下定義,其他參考書(shū)好象也沒(méi)有下定義。
二、關(guān)于const的具體作用
——const作用就靈活了,一個(gè)表達(dá)式中const放置的位置不同,效果可能就不一樣了。下面分具體情況分析(當(dāng)然,所舉的情況并非覆蓋全部情況)
A、const最經(jīng)常的用法
1.為了防止傳遞的函數(shù)參數(shù)不被修改,在調(diào)用函數(shù)的形參中用const關(guān)鍵字.
/pic/p>
int FindNum(const int array[], int num, int conut);/pic/p>
/pic/p>
int FindNum(const int array[], int num, int count)
{
int i;
int flag = 1;
for (i = 0; (i < count) && flag; i++)
{
if (array[i] == num)
{
flag = 0;
break;
}
}
return flag;
}
/pic/p>
上面這例子中,編譯器會(huì)把a(bǔ)rray[]當(dāng)作常量數(shù)據(jù)的數(shù)組看待。所以,假如你不小心給數(shù)組賦值,那么,編譯器就會(huì)報(bào)錯(cuò)了。因此,當(dāng)你不需要也不想修改數(shù)組的數(shù)據(jù)時(shí),最好用const把數(shù)組定義為常量數(shù)組。
2.const可以用來(lái)創(chuàng)建數(shù)組常量、指針常量、指向常量的指針等:
const char ch = a;
const int a[5] = {1, 2, 3, 4, 5};
const int *p = a; /pic/p>
int * const p = a; /pic/p>
const int * const p = a; /pic/p>
前兩種情況很簡(jiǎn)單,現(xiàn)在著重分析一下后三種用法,因?yàn)檫@3種情況容易出錯(cuò),偶就有時(shí)候怕用錯(cuò)了干脆不用const.
——const int *p = a;
/pic/p>
/pic/p>
/pic/p>
/pic/p>
/pic/p>
/pic/p>
/pic/p>
——int * const p = a;
/pic/p>
/pic/p>
/pic/p>
/pic/p>
/pic/p>
/pic/p>
/pic/p>
/pic/p>
/pic/p>
/pic/p>
/pic/p>
/pic/p>
/pic/p>
/pic/p>
/pic/p>
/pic/p>
/pic/p>
——const int * const p = a;
/pic/p>
/pic/p>
/pic/p>
/pic/p>
/pic/p>
/pic/p>
/pic/p>
/pic/p>
B。const并不會(huì)阻止參數(shù)的修改
之所以把這作為一點(diǎn)來(lái)談,就是因?yàn)橛幸恍┡笥芽赡軙?huì)以為在函數(shù)參數(shù)中用了const就一定不可以改變
參數(shù),這實(shí)際上是錯(cuò)誤的理解,因?yàn),它并不阻止參?shù)的修改,下面舉個(gè)簡(jiǎn)單的例子來(lái)闡述一下;
#include
#include
void ChangeStr(const char *String);
int main(void)
{
char str[] = "The C programme";
Change(str);
printf(str);
system("Pause");
return 0;
}
void ChangeStr(const char *String)
{
char *Source = (char *)String;
while (*Source)
{
*Source = toupper(*Source);
Source++;
}
}
/pic/p>
上面的程序把字符串中的每個(gè)字符都轉(zhuǎn)換成大寫(xiě)字母了。因?yàn)?String把地址給了*Source,而*Source的值的改變編譯器并不干涉,可能有的編譯器會(huì)發(fā)出警告之類(lèi)。上面的程序只是為了說(shuō)明const并不會(huì)阻止參數(shù)的修改,如果象上面程序那樣,個(gè)人感覺(jué)沒(méi)什么意義,只會(huì)讓人容易混亂而已。
關(guān)于CONST的用法和理解本人也就只能說(shuō)這么多了,當(dāng)然,很可能有更多高級(jí)或者少用的用法,由于水平
和經(jīng)驗(yàn)有限,確實(shí)不能再說(shuō)些什么。
一、C++中const的作用和用法
不考慮類(lèi)的情況:
const常量在定義時(shí)必須初始化,之后無(wú)法修改
const形參可以接收const和非const類(lèi)型的實(shí)參
考慮類(lèi)的情況:
const成員變量:不能在類(lèi)定義外初始化,只能通過(guò)構(gòu)造函數(shù)的初始化列表進(jìn)行初始化
const成員函數(shù):const對(duì)象不可以調(diào)用非const成員函數(shù);非const對(duì)象都可以調(diào)用,但不管怎么樣都不能夠修改非mutable修飾變量的值
const 在編譯階段確定其值,它定義的常量占用靜態(tài)存儲(chǔ)區(qū)的空間,程序運(yùn)行時(shí)只有一份,也可以進(jìn)行調(diào)試
優(yōu)點(diǎn):
有數(shù)據(jù)存儲(chǔ)類(lèi)型,在定義式可進(jìn)行安全性檢查
可調(diào)試
占用較少的空間
二、如何理解頂層const和底層const
概念區(qū)分
頂層const:指的是const修飾的變量本身是一個(gè)常量,無(wú)法修改,指的是指針,就是 * 號(hào)的右邊
底層const:指的是const修飾的變量所指向的對(duì)象是一個(gè)常量,指的是所指變量,就是 * 號(hào)的左邊
區(qū)分作用:
執(zhí)行對(duì)象拷貝時(shí)有限制,常量的底層const不能賦值給非常量的底層const
使用命名的強(qiáng)制類(lèi)型轉(zhuǎn)換函數(shù)const_cast時(shí),只能改變運(yùn)算對(duì)象的底層const
三、說(shuō)說(shuō)const關(guān)鍵字的的作用有哪些?
阻止一個(gè)變量被改變,可以使用const關(guān)鍵字。在定義該const變量時(shí),通常需要對(duì)它進(jìn)行初始化,因?yàn)橐院缶蜎](méi)有機(jī)會(huì)再去改變它了
對(duì)指針來(lái)說(shuō),可以指定指針本身為const,也可以指定指針?biāo)傅臄?shù)據(jù)為const,或二者同時(shí)指定為const
在一個(gè)函數(shù)聲明中,const可以修飾形參,表明它是一個(gè)輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值
對(duì)于類(lèi)的成員函數(shù),若指定其為const類(lèi)型,則表明其是一個(gè)常函數(shù),不能修改類(lèi)的成員變量,類(lèi)的常對(duì)象只能訪問(wèn)類(lèi)的常成員函數(shù)
對(duì)于類(lèi)的成員函數(shù),有時(shí)候必須指定其返回值為const類(lèi)型,以使得其返回值不為“左值”
const成員函數(shù)可以訪問(wèn)非const對(duì)象的非const數(shù)據(jù)成員、const數(shù)據(jù)成員,也可以訪問(wèn)const對(duì)象內(nèi)的所有數(shù)據(jù)成員
非const成員函數(shù)可以訪問(wèn)非const對(duì)象的非const數(shù)據(jù)成員、const數(shù)據(jù)成員,但不可以訪問(wèn)const對(duì)象的任意數(shù)據(jù)成員
一個(gè)沒(méi)有明確聲明為const的成員函數(shù)被看作是將要修改對(duì)象中數(shù)據(jù)成員的函數(shù),而且編譯器不允許它為一個(gè)const對(duì)象所調(diào)用。因此const對(duì)象只能調(diào)用const成員函數(shù)
const類(lèi)型變量可以通過(guò)類(lèi)型轉(zhuǎn)換符const_cast將const類(lèi)型轉(zhuǎn)換為非const類(lèi)型
const類(lèi)型變量必須定義的時(shí)候進(jìn)行初始化,因此也導(dǎo)致如果類(lèi)的成員變量有const類(lèi)型的變量,那么該變量必須在類(lèi)的初始化列表中進(jìn)行初始化
對(duì)于函數(shù)值傳遞的情況,因?yàn)閰?shù)傳遞是通過(guò)復(fù)制實(shí)參創(chuàng)建一個(gè)臨時(shí)變量傳遞進(jìn)函數(shù)的,函數(shù)內(nèi)只能改變臨時(shí)變量,但無(wú)法改變實(shí)參。則這個(gè)時(shí)候無(wú)論加不加const對(duì)實(shí)參不會(huì)產(chǎn)生任何影響。但是在引用或指針傳遞函數(shù)調(diào)用中,因?yàn)閭鬟M(jìn)去的是一個(gè)引用或指針,這樣函數(shù)內(nèi)部可以改變引用或指針?biāo)赶虻淖兞浚@時(shí)const 才是實(shí)實(shí)在在地保護(hù)了實(shí)參所指向的變量。因?yàn)樵诰幾g階段編譯器對(duì)調(diào)用函數(shù)的選擇是根據(jù)實(shí)參進(jìn)行的,所以只有引用傳遞和指針傳遞可以用是否加const來(lái)重載。一個(gè)擁有頂層const的形參無(wú)法和另一個(gè)沒(méi)有頂層const的形參區(qū)分開(kāi)來(lái)。
【const的理解和用法】相關(guān)文章:
c++ const引用與非const引用02-07
C語(yǔ)言中Static和Const關(guān)鍵字的作用11-19
C++中const-cast與reinterpret-cast運(yùn)算符的用法09-29
C語(yǔ)言的const使用方法02-18
c++中const關(guān)鍵字01-25