const關鍵字 分析與運用

2021-10-03 06:14:54 字數 2643 閱讀 4374

const 限定符,把乙個物件轉換成乙個常量

兩者都可以用來定義常量

const 定義時,定義了常量的型別,更精確一些

#define 只是簡單的文字替換,除了可以定義常量外,還可以用來定義一些簡單的函式,有點類似內聯函式(inline)。const和define定義的常量可以放在標頭檔案裡面(可以多次宣告,但只能定義一次)

const 定義常量有型別,#define 沒有型別修飾,所以常量比巨集多型別檢查

#define 在預處理階段進行的是**替換,而 const 是將值共別人使用,不會開闢空間複製值以供使用,兩者相比,#define 需要的記憶體較多

處理方式不同,#define 在預處理階段,const 在編譯執行階段使用

首先要先學會找到 const 的限定範圍,下面有幾個例子:

const int data:變數的值不允許被修改;

int const data:同上;

const int * data:指標的值不允許被修改;

int const * data:指標的值不允許被修改;

int & const data ; //位址不能被修改,在此處,該寫法無意義,引用本身就是乙個 const 指標,本身就不能改變指向

方法為從後往前,找到 const 後面修飾的變數型別,一般情況下,可以找 const 前的型別,在什麼後面,就是什麼型別,如果 const 在第一位就向後移一位

c 語言中用 const 宣告時必須進行初始化,c++ 中不一定

用 const 宣告的變數雖然增加了分配空間,但是可以不保證型別安全。c 標準中,const定義的常量是全域性的,c++中視宣告位置而定

const   char *a;

char * const b;

a++;

//b++;

在這裡,a 為值不可改變,b 為指標不可變,即指向不變,但固定記憶體單元值可變,所以應該寫為 (*b)++

int const*const  a;
判斷上面這段**的意義:

a 是指向記憶體單元的值的指標,指標指向不變,指標指向的變數的值不可變

可以把非 const 物件的位址賦給指向 const 物件的指標,不可以把乙個const物件的位址賦給乙個普通的、非const物件的指標

另外,要注意,在對指標進行限制時最好要同時賦初值,以防止野指標(指標指向不允許訪問的記憶體或不存在的記憶體)的出現,造成程式崩潰

引用是另乙個變數的別名,它本身就是乙個常量。不能再讓引用成為另乙個變數的別名,因此只剩下位址是可變的, 引用的位址不能被修改,即代表的記憶體區域是否可變

const 修飾類成員變數要在類構造中進行初始化

const 修飾的類成員變數的生命週期是類物件的生命週期,物件被建立時才有這個常量。不是所有類例項的物件使用乙個常量;若想所有類物件使用同乙個常量使用列舉:enum em;但是列舉值得大小有限,em的大小是4位元組

typedef  int* a;

const a b;

上面**的含義為 int* 型別的寫法也可以為 a,const 修飾的是 b,若補全為 const int* b,但是和通常結果不一樣,b 是 int* 型別的常量,這裡不能理解為文字擴充套件的情況

將函式傳入引數宣告為 const是為了效率,而不是想讓函式能夠修改物件的值。將指標引數宣告為const,函式將不修改由這個引數所指的物件,通常修飾指標引數和引用引數,例:

void fun(const a * i);//修飾指標型傳入引數

void fun(const a& i);//修飾引用型傳入引數

在函式返回乙個位址或者引用時,呼叫得到函式返回的位址或者引用後就可以修改所指或者代表的物件。如果希望函式的呼叫不修改這個返回的內容,就應該返回乙個常量

const int function(); //此時const無意義

const my function(); //函式返回自定義型別 my.

在 c++ 中,const 物件只能訪問 const 成員函式,非const物件可以訪問任意的成員函式

const 物件的成員不能被修改,但通過指標維護的物件可以修改

常常有一些成員函式不改變類的資料成員,即這些函式是"唯讀"函式,而有一些函式要修改類資料成員的值,加上 const 防止資料成員被修改

const成員函式不可以修改物件的資料,例:

void fun()const;
但是寫法和const內建指標有所不同:

char * const 相當於 const container<>::iterator   //可以修改指標所指的值, 但不能修改指標的位址;

const char * 相當於 container<>::const_iterator //可以修改指標位址, 但不能修改指標所指的值

c++ 中 const 一般是看成編譯器的常量,編譯器不為 const 分配空間,只是在編譯期間將其值儲存在名字表中,並在合適的時候折合在**中

c++中,const 預設使用內部連線,而 c 中使用外部連線

c++中,是否為 const 分配空間要看具體情況,如果加上關鍵字 extern 或者取 const 變數位址,則編譯器為 const 分配儲存空間

const關鍵字與指標

1 const修飾指標的四種形式 a.const是關鍵字,在c語言中原來修飾變數,表示這個變數是常量。const int inum 10 和 int const inum 10 的效果是一樣的。b.const修飾指標有4種形式。區分清楚這4種即可全部理解const和指標。1 const int p ...

const關鍵字與指標

const關鍵字與指標 const修飾指標的4種形式 1 const.關鍵字,在c語言中用來修飾變數,表示這個變數是常量。2 const修飾指標有4種形式,區分清楚這4種即可全部理解const和指標。第一種 const int p 第二種 int const p 第三種 int const p 第四...

const 關鍵字與指標

一.入門 概念引入 定義乙個 int 型別的普通變數 val 假設它的值是 10。再定義乙個指向該變數的指標 val ptr 它儲存了 val 的位址。1 int val 10 2 int val ptr val 乙個 int 型別的變數儲存的是 int 型別的值,同理,乙個指向 int 型別的指標...