亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

C語言

const的理解和用法

時(shí)間:2024-08-28 11:46:07 海潔 C語言 我要投稿
  • 相關(guān)推薦

const的理解和用法

  const是一個C語言(ANSI C)的關(guān)鍵字,具有著舉足輕重的地位。它限定一個變量不允許被改變,產(chǎn)生靜態(tài)作用。使用const在一定程度上可以提高程序的安全性和可靠性。下面是小編精心整理的const的理解和用法,希望對大家有所幫助。

  一、關(guān)于const的具體定義:

  ——個人感覺很難對它下一個標(biāo)準(zhǔn)的定義,因?yàn)榈挠梅ê莒`活,似乎對它定義后總無法讓人能夠明白它的意思,而且容易讓人產(chǎn)生誤解(也許是偶水平太菜了)。例如,把它有定義:一個能夠讓變量變成無法修改的常量的關(guān)鍵字。那么,這樣的話,就可能讓人誤解為只要有const在定義變量里面,那變量就無論怎樣都無法修改。這樣的理解是很片面的(下面用法方面將對這問題做探討)。因此,本人在此不敢對它下定義,其他參考書好象也沒有下定義。

  二、關(guān)于const的具體作用

  ——const作用就靈活了,一個表達(dá)式中const放置的位置不同,效果可能就不一樣了。下面分具體情況分析(當(dāng)然,所舉的情況并非覆蓋全部情況)

  A、const最經(jīng)常的用法

  1.為了防止傳遞的函數(shù)參數(shù)不被修改,在調(diào)用函數(shù)的形參中用const關(guān)鍵字.

  //Example ->

  int FindNum(const int array[], int num, int conut);//聲明函數(shù)

  //code...

  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;

  }

  //code...

  上面這例子中,編譯器會把a(bǔ)rray[]當(dāng)作常量數(shù)據(jù)的數(shù)組看待。所以,假如你不小心給數(shù)組賦值,那么,編譯器就會報(bào)錯了。因此,當(dāng)你不需要也不想修改數(shù)組的數(shù)據(jù)時(shí),最好用const把數(shù)組定義為常量數(shù)組。

  2.const可以用來創(chuàng)建數(shù)組常量、指針常量、指向常量的指針等:

  const char ch = a;

  const int a[5] = {1, 2, 3, 4, 5};

  const int *p = a; //a是一個數(shù)組的首地址.p是指向常量的指針

  int * const p = a; //a是一個數(shù)組的首地址.p是指針常量;

  const int * const p = a; //a是一個數(shù)組的首地址。p是指向常量的指針常量

  前兩種情況很簡單,現(xiàn)在著重分析一下后三種用法,因?yàn)檫@3種情況容易出錯,偶就有時(shí)候怕用錯了干脆不用const.

  ——const int *p = a;

  //p是指向常量的指針,因此,不可以通過給指針賦值來改變數(shù)組

  //中的數(shù)據(jù),例如:

  // *p = 10;

  // *(p + 2) = 1;

  //假如指向常量指針可以改變值,那么,就等于也改變了數(shù)組的數(shù)

  //據(jù)了。假如你不理解,偶倒有一個辦法讓你理解,你就想你和一

  //個人綁在一起,有可能你移動了位置而他不跟著你移動嗎!哈哈

  ——int * const p = a;

  //看這表達(dá)式,const的位置和第一個不同吧!他們的用法和作用

  //就完全不一樣了。這時(shí)候p是指針常量,我們知道,指針是指向

  //了一個數(shù)組的首地址,那么,它的位置就不可以改變了。但是你

  //現(xiàn)在應(yīng)該和第一個表達(dá)式比較了,現(xiàn)在的數(shù)組并不是常量數(shù)組,

  //所以數(shù)組的數(shù)據(jù)是可以改變的,而指針這時(shí)候它是不可以移動的

  //,指向數(shù)組第一個數(shù)據(jù),所以它可以而且只可以改變數(shù)組第一個

  //數(shù)據(jù)的值。這一點(diǎn)請別誤解,指針常量只是它的地址不可以改變

  //,并不是它指向的內(nèi)容一定不可以改變,這一點(diǎn)切記!

  //好啦。假如你又不理解,偶又有一個比較形象的例子來說明:

  //假如有一個固定的人拉著另外一個人的手,注意,固定的人相當(dāng)

  //于他是不可以由其他人來替換的。但是他可以拉其他人的手啊,

  //并不一定規(guī)定他必須拉同一個人的手啊,F(xiàn)在你應(yīng)該可以有個比

  //較深的印象和理解吧:P

  //下面舉幾個例子幫助理解:

  // *p = 2;

  // *(p+1) = 10;

  // p++;

  ——const int * const p = a;

  //假如前面兩種表達(dá)式的本質(zhì)你理解了,這種表達(dá)式你來理解根本

  //沒有問題,const現(xiàn)在有兩個,而且一個const的位置是第一種情

  //況的位置,第二個const是第二種情況的位置,所以這表達(dá)式的功

  //能就是前兩種情況的作用總合。這里不多說!

  //下面舉幾個例子幫助理解:

  // *p = 2;

  // *(p + 2) = 10;

  // p++;

  B。const并不會阻止參數(shù)的修改

  之所以把這作為一點(diǎn)來談,就是因?yàn)橛幸恍┡笥芽赡軙詾樵诤瘮?shù)參數(shù)中用了const就一定不可以改變

  參數(shù),這實(shí)際上是錯誤的理解,因?yàn),它并不阻止參?shù)的修改,下面舉個簡單的例子來闡述一下;

  #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++;

  }

  }

  //end

  上面的程序把字符串中的每個字符都轉(zhuǎn)換成大寫字母了。因?yàn)?String把地址給了*Source,而*Source的值的改變編譯器并不干涉,可能有的編譯器會發(fā)出警告之類。上面的程序只是為了說明const并不會阻止參數(shù)的修改,如果象上面程序那樣,個人感覺沒什么意義,只會讓人容易混亂而已。

  關(guān)于CONST的用法和理解本人也就只能說這么多了,當(dāng)然,很可能有更多高級或者少用的用法,由于水平

  和經(jīng)驗(yàn)有限,確實(shí)不能再說些什么。

  一、C++中const的作用和用法

  不考慮類的情況:

  const常量在定義時(shí)必須初始化,之后無法修改

  const形參可以接收const和非const類型的實(shí)參

  考慮類的情況:

  const成員變量:不能在類定義外初始化,只能通過構(gòu)造函數(shù)的初始化列表進(jìn)行初始化

  const成員函數(shù):const對象不可以調(diào)用非const成員函數(shù);非const對象都可以調(diào)用,但不管怎么樣都不能夠修改非mutable修飾變量的值

  const 在編譯階段確定其值,它定義的常量占用靜態(tài)存儲區(qū)的空間,程序運(yùn)行時(shí)只有一份,也可以進(jìn)行調(diào)試

  優(yōu)點(diǎn):

  有數(shù)據(jù)存儲類型,在定義式可進(jìn)行安全性檢查

  可調(diào)試

  占用較少的空間

  二、如何理解頂層const和底層const

  概念區(qū)分

  頂層const:指的是const修飾的變量本身是一個常量,無法修改,指的是指針,就是 * 號的右邊

  底層const:指的是const修飾的變量所指向的對象是一個常量,指的是所指變量,就是 * 號的左邊

  區(qū)分作用:

  執(zhí)行對象拷貝時(shí)有限制,常量的底層const不能賦值給非常量的底層const

  使用命名的強(qiáng)制類型轉(zhuǎn)換函數(shù)const_cast時(shí),只能改變運(yùn)算對象的底層const

  三、說說const關(guān)鍵字的的作用有哪些?

  阻止一個變量被改變,可以使用const關(guān)鍵字。在定義該const變量時(shí),通常需要對它進(jìn)行初始化,因?yàn)橐院缶蜎]有機(jī)會再去改變它了

  對指針來說,可以指定指針本身為const,也可以指定指針?biāo)傅臄?shù)據(jù)為const,或二者同時(shí)指定為const

  在一個函數(shù)聲明中,const可以修飾形參,表明它是一個輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值

  對于類的成員函數(shù),若指定其為const類型,則表明其是一個常函數(shù),不能修改類的成員變量,類的常對象只能訪問類的常成員函數(shù)

  對于類的成員函數(shù),有時(shí)候必須指定其返回值為const類型,以使得其返回值不為“左值”

  const成員函數(shù)可以訪問非const對象的非const數(shù)據(jù)成員、const數(shù)據(jù)成員,也可以訪問const對象內(nèi)的所有數(shù)據(jù)成員

  非const成員函數(shù)可以訪問非const對象的非const數(shù)據(jù)成員、const數(shù)據(jù)成員,但不可以訪問const對象的任意數(shù)據(jù)成員

  一個沒有明確聲明為const的成員函數(shù)被看作是將要修改對象中數(shù)據(jù)成員的函數(shù),而且編譯器不允許它為一個const對象所調(diào)用。因此const對象只能調(diào)用const成員函數(shù)

  const類型變量可以通過類型轉(zhuǎn)換符const_cast將const類型轉(zhuǎn)換為非const類型

  const類型變量必須定義的時(shí)候進(jìn)行初始化,因此也導(dǎo)致如果類的成員變量有const類型的變量,那么該變量必須在類的初始化列表中進(jìn)行初始化

  對于函數(shù)值傳遞的情況,因?yàn)閰?shù)傳遞是通過復(fù)制實(shí)參創(chuàng)建一個臨時(shí)變量傳遞進(jìn)函數(shù)的,函數(shù)內(nèi)只能改變臨時(shí)變量,但無法改變實(shí)參。則這個時(shí)候無論加不加const對實(shí)參不會產(chǎn)生任何影響。但是在引用或指針傳遞函數(shù)調(diào)用中,因?yàn)閭鬟M(jìn)去的是一個引用或指針,這樣函數(shù)內(nèi)部可以改變引用或指針?biāo)赶虻淖兞浚@時(shí)const 才是實(shí)實(shí)在在地保護(hù)了實(shí)參所指向的變量。因?yàn)樵诰幾g階段編譯器對調(diào)用函數(shù)的選擇是根據(jù)實(shí)參進(jìn)行的,所以只有引用傳遞和指針傳遞可以用是否加const來重載。一個擁有頂層const的形參無法和另一個沒有頂層const的形參區(qū)分開來。

【const的理解和用法】相關(guān)文章:

英語單詞necessary的用法和辨析02-14

英語單詞convenient的用法和例句04-15

英語單詞represent的用法和辨析02-02

2017英語高頻短語的用法和區(qū)別12-10

小托福詞匯知識:that和which用法03-22

英語單詞all和both、every和each的用法04-28

理解java和python類變量04-02

CSS中的zoom屬性和scale屬性的用法及區(qū)別12-04

《推斷文言虛詞的意義和用法》教案設(shè)計(jì)04-03

英語閱讀理解的解題步驟和方法03-15