国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++形參中const char * 與 char * 的區(qū)別

2019-11-06 06:19:44
字體:
供稿:網(wǎng)友

在函數(shù)調(diào)用時,我們經(jīng)常看見一個函數(shù)的接受參數(shù)為(const char *);

  例如strlen()函數(shù),它的定義為:

 size_t strlen(       const char *str);

  那么將形參設(shè)置為const的到底有什么好處呢?網(wǎng)絡(luò)上經(jīng)常的回答是:這樣將把形參限定為常量,使得我們不能修改它。總感覺這種說法似乎是明白了,但再仔細的想下,總覺得少點什么。

  在我看來,這樣做的好處有2點:

  第一,   保證了實參不能被修改,增加了安全性。

  第二,   擴大了該函數(shù)的參數(shù)的接收范圍,使得函數(shù)更具通用性。

  而第二點,在我看來,是讓我恍然大悟的,終于理解了const的作用。

從下邊這個例子中,我們可以看出這兩點好處;寫一個函數(shù)length(),實現(xiàn)與strlen()相同的功能,然后進行調(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;}

  上面程序可以正確的編譯運行,并且輸出3行“common  length:16”。

  但是,如果我想計算一下一個string類型的長度呢?因為length(char *s)的接受參數(shù)為char *,我們可以使用stirng類的c_str()方法返回string的字符指針(char *),于是,我們這樣操作:

string str2 = "you are a boy 5!";length(str2.c_str());

  上邊的做法看起來沒什么錯誤,可是這樣是通不過編譯的,因為str2.c_str()返回的是const char *,而我們的length接受的是char *,const char * 是不能轉(zhuǎn)換成 char *的。

    因為const char * s 表示其指針所指向的內(nèi)容是只讀的,不能被修改,而char * s指向的內(nèi)容是可以修改的,把一個常量指針轉(zhuǎn)換成普通的指針,這顯然是不符合邏輯的。關(guān)于常量指針和指針常量以及普通的指針的區(qū)別,請查閱相關(guān)文檔。

    我們再回過頭來看length的需求,length的目的是計算出字符串的長度,它不對字符串本身做修改,對于類似的這種需求的函數(shù)(不修改實參),我們應(yīng)該而且強烈推薦使用const來修飾形參,這也是一種良好的編碼習慣。

    很明顯的看出,如果這樣定義:void length(char *s),它將不能接受常量字符指針與常量字符數(shù)組。這正是使用const定義形參的第2個好處:擴大了該函數(shù)的參數(shù)的接收范圍;使得函數(shù)更具通用性。

    常量字符指針是指:str2.c_str()或者str2.data()的返回值,或者自己定義的

    常量字符數(shù)組是指:const char str1[] = "you are a boy 1!";


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 贞丰县| 天门市| 桃江县| 宜君县| 仙居县| 安吉县| 化隆| 会昌县| 花垣县| 昌都县| 兴国县| 萍乡市| 万州区| 拉萨市| 乌什县| 松原市| 收藏| 濉溪县| 武定县| 莱州市| 衡阳县| 日土县| 即墨市| 黔江区| 都安| 江达县| 山阴县| 米脂县| 青浦区| 潢川县| 乌鲁木齐县| 衡南县| 金华市| 莆田市| 西平县| 察隅县| 天门市| 万全县| 庆阳市| 宿迁市| 乌恰县|