最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C/C++ 中const關(guān)鍵字的用法小結(jié)

 更新時(shí)間:2020年02月28日 14:18:25   作者:koomee  
C++中的const關(guān)鍵字的用法非常靈活,而使用const將大大改善程序的健壯性。這篇文章主要介紹了C/C++ 中const關(guān)鍵字的用法,需要的朋友可以參考下

C++中的const關(guān)鍵字的用法非常靈活,而使用const將大大改善程序的健壯性。

Const作用

NO. 作用 說明 參考
1 可以定義const常量 const int Max = 100;
2 便于進(jìn)行類型檢查 const常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型。編譯器可以對前者進(jìn)行類型安全檢查,而對后者只進(jìn)行字符替換,沒有類型安全檢查,并且在字符替換時(shí)可能會(huì)產(chǎn)生意料不到的錯(cuò)誤 void f(const int i) { ………} //對傳入的參數(shù)進(jìn)行類型檢查,不匹配進(jìn)行提示
3 可以保護(hù)被修飾的東西 防止意外的修改,增強(qiáng)程序的健壯性 void f(const int i) { i=10; //error! } //如果在函數(shù)體內(nèi)修改了i,編譯器就會(huì)報(bào)錯(cuò)
4 可以很方便地進(jìn)行參數(shù)的調(diào)整和修改 同宏定義一樣,可以做到不變則已,一變都變
5 為函數(shù)重載提供了一個(gè)參考 class A { void f(int i) {……} //一個(gè)函數(shù) void f(int i) const {……} //上一個(gè)函數(shù)的重載 …… };
6 可以節(jié)省空間,避免不必要的內(nèi)存分配 const定義常量從匯編的角度來看,只是給出了對應(yīng)的內(nèi)存地址,而不是象#define一樣給出的是立即數(shù),所以,const定義的常量在程序運(yùn)行過程中只有一份拷貝,而#define定義的常量在內(nèi)存中有若干個(gè)拷貝 define PI 3.14159 //常量宏 const doulbe Pi=3.14159; //此時(shí)并未將Pi放入ROM中 …… double i=Pi; //此時(shí)為Pi分配內(nèi)存,以后不再分配! double I=PI; //編譯期間進(jìn)行宏替換,分配內(nèi)存 double j=Pi; //沒有內(nèi)存分配 double J=PI; //再進(jìn)行宏替換,又一次分配內(nèi)存!
7 提高了效率 編譯器通常不為普通const常量分配存儲(chǔ)空間,而是將它們保存在符號(hào)表中,這使得它成為一個(gè)編譯期間的常量,沒有了存儲(chǔ)與讀內(nèi)存的操作,使得它的效率也很高

提到 const 都知道是修飾常量的,在一個(gè)變量前加上const 關(guān)鍵字后這個(gè)常量就不可以再賦值了!

C語言中不是有#define嗎,干嘛還要用const呢,我想事物的存在一定有它自己的道理,所以說const的存在一定有它的合理性,與預(yù)編譯指令相比,const修飾符有以下的優(yōu)點(diǎn):

1、預(yù)編譯指令只是對值進(jìn)行簡單的替換,不能進(jìn)行類型檢查

2、可以保護(hù)被修飾的東西,防止意外修改,增強(qiáng)程序的健壯性

3、編譯器通常不為普通const常量分配存儲(chǔ)空間,而是將它們保存在符號(hào)表中,這使得它成為一個(gè)編譯期間的常量,沒有了存儲(chǔ)與讀內(nèi)存的操作,使得它的效率也很高。

(以上三點(diǎn)摘抄自:http://m.fzitv.net/article/70831.htm

const 的應(yīng)用

1 定義常量

 const int a=5;
 int const a=5;

兩種用法是一樣的,這里變量 a 在第一次定義時(shí)復(fù)制后,在程序運(yùn)行中就不可再賦值改變了;

例如:

 int main (int argc,char* argv)
 { 
 const int a=5;

 int const b=5;

 a=3; //編譯時(shí)將會(huì)報(bào)錯(cuò),常量不可修改
 b=8;//編譯時(shí)將會(huì)報(bào)錯(cuò),常量不可修改
 }

const用于修飾常量靜態(tài)字符串,

例如:

const char* Str="ABCDEFGH";

此時(shí) const修飾過的str就是常量 我們不可更改Str的值 如 Str[3]='H'; 這時(shí)候是錯(cuò)誤的,

2 常量指針與指針常量

很多人往往分不清這兩者的形態(tài),

常量指針:

const int* pv;

int const* pv;

兩種定義方式一樣,都是定義一個(gè)常量指針;即不可通過這個(gè)指針修改所指向地址的值;但是所指向的地址的值是可以通過其他變量指針修改的;

但是常量指針可以賦值新的指向地址;

例如:

 int main (int argc,char* argv)

  { 

   int a=5;

   int b=7;

   const int* m=&a;

   int const* n=&b;

   int* p = n;//把常量指針 n 指向的地址賦給p;

   *m=3; //編譯時(shí)將會(huì)報(bào)錯(cuò),常量指針不可修改所指向的地址的值

   *n=8;//編譯時(shí)將會(huì)報(bào)錯(cuò),常量指針不可修改所指向的地址的值

   *p = 9; //編譯無措,可以通過變量指針修改常量指針?biāo)赶虻牡刂返闹?

   m=&b; //編譯無措,常量指針可以修改所指向的地址

   n=&a; //編譯無措,常量指針可以修改所指向的地址

   }

指針常量

int* const pv;

是指這個(gè)指針指向的地址不可在改變,但指向的地址的值可以再改變;(指針常量是指指針本身是個(gè)常量,不能在指向其他的地址)

 int main(int argc,char* argv)

  { 

  int a=5; 

  int b=7; 

  int* const m=&a; 

  *m =8; //編譯無措 指針常量可以通過該指針修改所指向的地址的值

  m = &b; //編譯出錯(cuò) 指針常量不可修改所指向想的地址

  }

指向常量的常指針

常量指針結(jié)合指針常量 即指向常量的常指針 表示指針本身和指針?biāo)赶虻牡刂吩诙x時(shí)賦值后都不可再改變;

定義如下:

const int* const p;

那么如何來區(qū)分常量指針和指針常量呢?

這就要明白關(guān)鍵字的結(jié)合優(yōu)先級(jí)了,

如:const int* p;

以*優(yōu)先級(jí)最高,先和int 結(jié)合 得到 " int* " (讀作整形指針) 然后(int*)和 const 結(jié)合得到 " const(int*)" (讀作常量指針) ,然后才和p結(jié)合得到"(const(int*))p" (讀作常量指針p),

int* const p;

同理,以*優(yōu)先級(jí)最高,先和int結(jié)合得到"int*"(讀作整形指針),然后(int*)和const結(jié)合得到"(int*)(const)"(讀作指針常量),最后才和p結(jié)合得到"(int*)(const)p"(讀作指針常量p)

3 常量函數(shù)

常見的定義方式

 class AA
 {
 public:
 void mf_Fun1()
 {
  int b=10;
  num=b;
 }
 void mf_Fun2() const
 { 
  cout<<num; //編譯無措,只讀取成員變量
  num+=15; //錯(cuò)誤 const 函數(shù)不可修改其成員變量,只可讀取  
 }
 }
int main()
{
 AA a1; 
 const AA a2; //注意這里的const關(guān)鍵字
 a2.mf_Fun2();
 a2.mf_Fun1(); // 錯(cuò)誤,const的實(shí)例對象 不能訪問非const的函數(shù)
}

在類成員函數(shù)的聲明和定義中, const的函數(shù)不能對其數(shù)據(jù)成員進(jìn)行修改操作。 const的對象,不能引用非const的成員函數(shù)。

這兒的const就是說這個(gè)函數(shù)操作不會(huì)對變量或是對象之類的值有影響 比如、有一個(gè)human類 ,現(xiàn)在要得到某個(gè)human類對象A的age 那么肯定是不會(huì)因?yàn)橄氲玫竭@個(gè)值而改變了age的大小,那么就可以寫一個(gè)函數(shù)int getAge()const這樣就好 這么做是為了防止在函數(shù)中對不應(yīng)該在這里改變的量不小心進(jìn)行了改變 (抄錄自 https://zhidao.baidu.com/question/1702736835898870060.html)

4 在什么情況下需要用到Const關(guān)鍵字?

4.1 修飾函數(shù)的參數(shù)

根據(jù)常量指針與指針常量,const修飾函數(shù)的參數(shù)也是分為三種情況

1、防止修改指針指向的內(nèi)容

void StringCopy(char *strDestination, const char *strSource);

其中 strSource 是輸入?yún)?shù),strDestination 是輸出參數(shù)。給 strSource 加上 const 修飾后,如果函數(shù)體內(nèi)的語句試圖改動(dòng) strSource 的內(nèi)容,編譯器將指出錯(cuò)誤。

2、防止修改指針指向的地址

void swap ( int * const p1 , int * const p2 )

指針p1和指針p2指向的地址都不能修改。

3、以上兩種的結(jié)合。

4.2 修飾函數(shù)的返回值

如果給以“指針傳遞”方式的函數(shù)返回值加 const 修飾,那么函數(shù)返回值(即指針)的內(nèi)容不能被修改,該返回值只能被賦給加const 修飾的同類型指針。 例如函數(shù)

const char * GetString(void);

如下語句將出現(xiàn)編譯錯(cuò)誤:

char *str = GetString();

正確的用法是

const char *str = GetString();

4.3 修飾全局變量

全局變量的作用域是整個(gè)文件,我們應(yīng)該盡量避免使用全局變量,因?yàn)橐坏┯幸粋€(gè)函數(shù)改變了全局變量的值,它也會(huì)影響到其他引用這個(gè)變量的函數(shù),

導(dǎo)致除了bug后很難發(fā)現(xiàn),如果一定要用全局變量,我們應(yīng)該盡量的使用const修飾符進(jìn)行修飾,這樣防止不必要的人為修改,使用的方法與局部變量是相同的。

4.4 寄存器變量定義和寄存器讀取

例如:

uint32_t* R0 =(uint32*)0x400F00FF; //定義一個(gè)地址為0x400F00FF的32bit寄存器變量

正確的定義方法:

uint32_t* const R0 =(uint32*)0x400F00FF; //定義一個(gè)指針常量R0指向地址為0x400F00FF的寄存器 這樣就保證變量R0指向的地址的唯一性,

若是指向一個(gè)只讀寄存器則應(yīng)該按如下定義:

const uint32_t* const R0 =(uint32*)0x400F00FF; //定義一個(gè)指向常量的常指針 R0 指向地址為0x400F00FF的只讀寄存器,這樣就保證變量R0指向的地址的唯一性,同時(shí)不會(huì)因操作該指針修改指向地址的值

總結(jié)

到此這篇關(guān)于C/C++ 中const關(guān)鍵字的用法小結(jié)的文章就介紹到這了,更多相關(guān)C/C++ const關(guān)鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 判斷兩顆二叉樹是否相似的兩種方法

    判斷兩顆二叉樹是否相似的兩種方法

    今天小編就為大家分享一篇關(guān)于判斷兩顆二叉樹是否相似的兩種方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 超詳細(xì)分析C語言動(dòng)態(tài)內(nèi)存管理問題

    超詳細(xì)分析C語言動(dòng)態(tài)內(nèi)存管理問題

    動(dòng)態(tài)內(nèi)存是相對靜態(tài)內(nèi)存而言的。所謂動(dòng)態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存,本文帶你深入探究C語言中動(dòng)態(tài)內(nèi)存的管理
    2022-04-04
  • C++設(shè)計(jì)類不能被繼承的方法實(shí)例講解

    C++設(shè)計(jì)類不能被繼承的方法實(shí)例講解

    在Java 中定義了關(guān)鍵字final,被final修飾的類不能被繼承,C++中如何實(shí)現(xiàn),下面我們來看一個(gè)例子
    2013-12-12
  • c++類的隱式轉(zhuǎn)換與強(qiáng)制轉(zhuǎn)換重載詳解

    c++類的隱式轉(zhuǎn)換與強(qiáng)制轉(zhuǎn)換重載詳解

    轉(zhuǎn)換函數(shù)的名稱是類型轉(zhuǎn)換的目標(biāo)類型,因此,不必再為它指定返回值類型;轉(zhuǎn)換函數(shù)是被用于本類型的數(shù)值或變量轉(zhuǎn)換為其他的類型,也不必帶參數(shù)
    2013-09-09
  • C++使用遞歸和非遞歸算法實(shí)現(xiàn)的二叉樹葉子節(jié)點(diǎn)個(gè)數(shù)計(jì)算方法

    C++使用遞歸和非遞歸算法實(shí)現(xiàn)的二叉樹葉子節(jié)點(diǎn)個(gè)數(shù)計(jì)算方法

    這篇文章主要介紹了C++使用遞歸和非遞歸算法實(shí)現(xiàn)的二叉樹葉子節(jié)點(diǎn)個(gè)數(shù)計(jì)算方法,涉及C++二叉樹的定義、遍歷、統(tǒng)計(jì)相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • 基于C語言實(shí)現(xiàn)見縫插針游戲的示例代碼

    基于C語言實(shí)現(xiàn)見縫插針游戲的示例代碼

    見縫插針游戲就是使用鼠標(biāo)左鍵點(diǎn)擊發(fā)射針,當(dāng)兩個(gè)針的夾角小于一定限制時(shí),游戲結(jié)束。本文將用C語言實(shí)現(xiàn)這一有趣游戲,感興趣的可以了解一下
    2022-11-11
  • C++程序簡單示例

    C++程序簡單示例

    這篇文章主要給大家分享的是C++程序簡單示例,下面文章將圍繞C++程序的相關(guān)資料展開內(nèi)容,需要的朋友可以參考一下,希望對你有所幫助
    2021-11-11
  • c++中拷貝構(gòu)造函數(shù)的參數(shù)類型必須是引用

    c++中拷貝構(gòu)造函數(shù)的參數(shù)類型必須是引用

    如果拷貝構(gòu)造函數(shù)中的參數(shù)不是一個(gè)引用,即形如CClass(const CClass c_class),那么就相當(dāng)于采用了傳值的方式(pass-by-value),而傳值的方式會(huì)調(diào)用該類的拷貝構(gòu)造函數(shù),從而造成無窮遞歸地調(diào)用拷貝構(gòu)造函數(shù)。因此拷貝構(gòu)造函數(shù)的參數(shù)必須是一個(gè)引用
    2013-07-07
  • C++中回調(diào)函數(shù)及函數(shù)指針的實(shí)例詳解

    C++中回調(diào)函數(shù)及函數(shù)指針的實(shí)例詳解

    這篇文章主要介紹了C++中回調(diào)函數(shù)及函數(shù)指針的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • c語言定時(shí)器示例分享

    c語言定時(shí)器示例分享

    在linux下開發(fā),使用的是C語言。適用于需要定時(shí)的軟件開發(fā),以系統(tǒng)真實(shí)的時(shí)間來計(jì)算,它送出SIGALRM信號(hào)。每隔一秒定時(shí)一次
    2014-04-04

最新評論

阜阳市| 合水县| 五家渠市| 博爱县| 灯塔市| 荆州市| 隆尧县| 永胜县| 新绛县| 顺昌县| 南川市| 英德市| 澄城县| 台前县| 扎兰屯市| 怀柔区| 通榆县| 新竹县| 柘荣县| 准格尔旗| 怀化市| 河曲县| 遂宁市| 三门县| 吉木萨尔县| 耒阳市| 衡阳市| 霍林郭勒市| 泽库县| 阳春市| 噶尔县| 崇阳县| 游戏| 高阳县| 肃宁县| 翁源县| 墨竹工卡县| 郑州市| 宁海县| 罗城| 石嘴山市|