在函數(shù)調(diào)用時(shí),我們經(jīng)??匆?jiàn)一個(gè)函數(shù)的接受參數(shù)為(const char *);
例如strlen()函數(shù),它的定義為:
size_t strlen( const char *str);那么將形參設(shè)置為const的到底有什么好處呢?網(wǎng)絡(luò)上經(jīng)常的回答是:這樣將把形參限定為常量,使得我們不能修改它??偢杏X(jué)這種說(shuō)法似乎是明白了,但再仔細(xì)的想下,總覺(jué)得少點(diǎn)什么。
在我看來(lái),這樣做的好處有2點(diǎn):
第一, 保證了實(shí)參不能被修改,增加了安全性。
第二, 擴(kuò)大了該函數(shù)的參數(shù)的接收范圍,使得函數(shù)更具通用性。
而第二點(diǎn),在我看來(lái),是讓我恍然大悟的,終于理解了const的作用。
從下邊這個(gè)例子中,我們可以看出這兩點(diǎn)好處;寫(xiě)一個(gè)函數(shù)length(),實(shí)現(xiàn)與strlen()相同的功能,然后進(jìn)行調(diào)用,代碼如下:
#include <string>#include <stdio.h>#include <tchar.h>#include <iostream>using namespace std;void length(char *s){ int count = 0; for (;*s++ !='/0';count++); PRintf("common length: %d/n",count);}int _tmain(int argc, _TCHAR* argv[]){ char str1[] = "you are a boy 1!"; length(str1); //字符數(shù)組 length("you are a boy2 !"); //常量 char *s = "you are a boy 3!"; length(s); //字符指針 return 0;}上面程序可以正確的編譯運(yùn)行,并且輸出3行“common length:16”。
但是,如果我想計(jì)算一下一個(gè)string類(lèi)型的長(zhǎng)度呢?因?yàn)閘ength(char *s)的接受參數(shù)為char *,我們可以使用stirng類(lèi)的c_str()方法返回string的字符指針(char *),于是,我們這樣操作:
string str2 = "you are a boy 5!";length(str2.c_str());上邊的做法看起來(lái)沒(méi)什么錯(cuò)誤,可是這樣是通不過(guò)編譯的,因?yàn)閟tr2.c_str()返回的是const char *,而我們的length接受的是char *,const char * 是不能轉(zhuǎn)換成 char *的。
因?yàn)閏onst char * s 表示其指針?biāo)赶虻膬?nèi)容是只讀的,不能被修改,而char * s指向的內(nèi)容是可以修改的,把一個(gè)常量指針轉(zhuǎn)換成普通的指針,這顯然是不符合邏輯的。關(guān)于常量指針和指針常量以及普通的指針的區(qū)別,請(qǐng)查閱相關(guān)文檔。
我們?cè)倩剡^(guò)頭來(lái)看length的需求,length的目的是計(jì)算出字符串的長(zhǎng)度,它不對(duì)字符串本身做修改,對(duì)于類(lèi)似的這種需求的函數(shù)(不修改實(shí)參),我們應(yīng)該而且強(qiáng)烈推薦使用const來(lái)修飾形參,這也是一種良好的編碼習(xí)慣。
很明顯的看出,如果這樣定義:void length(char *s),它將不能接受常量字符指針與常量字符數(shù)組。這正是使用const定義形參的第2個(gè)好處:擴(kuò)大了該函數(shù)的參數(shù)的接收范圍;使得函數(shù)更具通用性。
常量字符指針是指:str2.c_str()或者str2.data()的返回值,或者自己定義的
常量字符數(shù)組是指:const char str1[] = "you are a boy 1!";
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注