C++進階—>const和define機制剖析

C++中的const和define

1 const基礎知識(用法、含義、好處)

初級理解:const是定義常量==》const意味着只讀 


const int a;

int const b;

const int *c;

int * const d;

const int * const e ;

含義:

//第一個第二個意思一樣 代表一個常整形數

//第三個 c是一個指向常整形數的指針(所指向的內存數據不能被修改,但是本身可以修改)

//第四個 d 常指針(指針變量不能被修改,但是它所指向內存空間可以被修改)

//第五個 e一個指向常整形的常指針(指針和它所指向的內存空間,均不能被修改)

const好處

//合理的利用const,

//1.指針做函數參數,可以有效的提高代碼可讀性,減少bug;

//2.清楚的分清參數的輸入和輸出特性

int setTeacher_err( const Teacher *p)

Const修改形參的時候,在利用形參不能修改指針所向的內存空間,即指針所指內存空間中的數據不能被修改 保證了內存空間中數據的安全性,避免多個指向該內存空間的指針對該內存空間中的數據不斷的被修改導致程序錯誤,保證了數據的互斥性。

2 C++中const運行機制

 

int main()

{

         const int a = 10;

         int *p = (int*)&a;

         printf("a===>%d\n", a);

         *p = 11;

         printf("a===>%d\n", a);

         return 0;

}

C++編譯器對const常量的處理:

當碰見常量聲明時,C++編譯器會將所有的const常量以(key,value)的形式存儲在符號表中,此符號表用戶無法操作,僅可取地址;

編譯過程中若發現使用常量則直接以符號表中的值替換,如上述代碼a=10,在程序中遇到a直接將其替換爲10;

編譯過程中若發現對const使用了extern或者&操作符,則給對應的常量分配存儲空間(分配的存儲空間有別於符號表空間,是單獨分配出來用戶可操作的存儲空間)


注意:

C++編譯器雖然可能爲const常量分配空間,但不會使用其存儲空間中的值。

結論:

1.C語言中const變量是隻讀變量,有自己的存儲空間

2.C++中的const常量可能分配存儲空間,也可能不分配存儲空間 

const常量爲全局,並且需要在其它文件中使用,需要分配存儲空間

當使用&操作符取const常量的地址,需要分配存儲空間

 

3 #define基礎知識

 

void fun1()

{

   #define a 10

   const int b = 20;

   //#undef a  # undef //若不讓define具有全局性,則在後加上undef註銷所有定義的常量,undef a 僅僅註銷a常量。

}

 

void fun2()

{

   printf("a = %d\n", a);

   printf("b = %d\n", b);

}

 

int main()

{

   fun1();

   fun2();

   return 0;

}

#define的含義與const相同,都是定義常量,只是define定義的爲全局型常量,const定義的常量有作用域

4 const和#define區別

對比:

1. C++中的const常量類似於宏定義

     const int c = 5; ≈ #define c 5

2.C++中的const常量與宏定義不同

   const常量是由編譯器處理的,提供類型檢查和作用域檢查,並可根據對常量的使用情況分配存儲空間

   宏定義(define)由預處理器處理,單純的文本替換



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章