天天看點

細說C++(七):const用法全解析

const 用法

const ‘隻讀’

在C語言中,const 為隻讀修飾,其實是可以改變的量

  • const int maxn=10;    
               
  • int array[maxn];   //error 錯誤,maxn仍是變量
               

C++

常量無位址概念,以’符号表‘形式;

  • key=a; value=1;
               
const int a=10;
 //  int *b=&a; 	[Error] invalid conversion from 'const int*' to 'int*' [-fpermissive]
 int *b=(int*)&a;
 //如果對常量取位址,編譯器會臨時開辟一空間(無法改變到a),讓這個指針存放這臨時空間的位址
           

幾種形式const

const int a;
int const b;  //等價

const int* c;   //常量指針
int * const d;  //指針常量 

const int * const e;  
           
  • 頂層 const
  • const 指針
  • const 引用
  • const 函數體
  1. const { } 定義于函數體前

常量成員函數

定義格式; string myclass::sstring const { }

聲明格式; string myclass::sstring const ;

2.void function()const;

define 與const對比
  1. #define定義的宏是在預處理階段進行替換的,const常量是在編譯、運作階段進行使用的(const 定義的常量依然是内置類型)。
  2. define的替換注意是僅僅的字元串替換,并不會檢查其合法性。
  3. 預處理階段做了的任務:

1:将頭檔案中的内容(源檔案之外的檔案)插入到源檔案中

2:進行了宏替換的過程(簡單的字元串替換),定義和替換了由#define指令定義的符号

3:删除掉注釋的過程,注釋是不會帶入到編譯階段

  1. 條件編譯

    所有的宏替換隻是簡單的字元串替換,注意是字元串替換,是以并不會檢查其合法性,而const定義的常量依然是内置類型等,是以會對其進行類型安全檢查。

    宏定義在程式中使用了幾次在預處理階段就會被展開幾次,并不會增加記憶體占用,但是宏定義每展開一次,代碼的長度就要發生變化,而const常量也會為其配置設定記憶體。

    而define定義的變量在記憶體中并沒有拷貝,因為所有的預處理指令都在預處理時進行了替換。

繼續閱讀