C 中CONST的深入淺出 三步走

2021-08-16 02:22:59 字數 2220 閱讀 1782

今天無聊,寫一點自己對

c++中

const

的理解,具體方法呢,還是按照三步走:是什麼,為什麼,怎麼樣。我相信大多數老程式猿都有著自己的思維方式,小風就比較習慣這種老套的方式。閒話就不多說了,開始正題。

作為c++中關鍵字之一的const,起作用如下:

1.內容上:其修飾的變數、函式、指標都為唯讀形式,即修飾的部分無法再去修改其值或是內容,具體實現後面會再說。很多教材都說成常量,這樣並不利於你理解,應該理解為值無法修改的變數

,本質上還是乙個變數,只是許可權上有所限制,但若是通關其他方法獲取其位址(例如堆疊中的const變數,因為有位址所以還是可以被修改)。

2.作用時間上:const是程式在編譯時起作用,作用是檢查是否有操作修改了被const修飾的變數,若有則編譯出錯。

有的時候,我們希望定義一種變數,而它的值不能被改變。比如:當我們使用乙個變數來表示緩衝區大小,使用變數的好處是當變數的大小不適合時,我們可以很方便的修改這個值,但是卻也要十分小心的去檢測這個值是否被程式一不小心的改變了,為了實現這一點,可以用const對其加以限定。

const int bufsize = 521;  //緩衝區大小為521

bufsize = 1024; //編譯錯誤:試圖向const物件拷貝資料;

使用const可修飾的地方主要有4個:成員變數、成員函式、函式的形參、函式的返回值。我們來乙個乙個乾掉。

int a1=2;   //這是乙個普通變數,並且被初始化

1.  const int a2=2;    //常量資料
若是後面有程式想改變其值,則會出現編譯出錯,(const在編譯時起作用),當然也有一些奇淫巧技可以改變他的值(題外話),比如:

2.   int *p = (int*)&a2;

*p = 5;

cout<

3. int * a3 = &a1; //乙個很平常的指標,把上面a1的位址傳了過來

4.   const int * a4 = &a1;    //指標指向的物件為常量,而指標本身並不是。

//可理解為右值&a1不能變,左值可a4可以變。(術語:底層const)

5.   int * const a5 = &a1;  //和上面的正好相反,理解為可理解為右值&a1能變,左值a5不可以變.(術語:頂層const)

6.   int const * const a6 = &a1;   //左右兩值均為常量

7. const int * const a7 = &a1; //同上,左右兩值均為常量。此兩種表達方式效果一樣

當const關鍵字去修飾乙個函式時,那麼在這個函式中,任何的成員變數都不能修改,否則報錯,我們用手來舉個栗子:

class  a                     //我們先來宣告乙個類,名字叫a

;void a::b() //我們開始定義那個普通的函式b

void a::c()const

還有一點比較重要的就是:const函式只能呼叫const函式,腦袋裡過一下。

其次:const的位置一定是要在函式的後面,不能再前面,這點一定要記住。

當const去修飾乙個函式的返回值時,表示這個值不能夠被修改,及返回乙個常變數,具體方法如下

const

int * fun()

當const去修飾形參的時候,指此形參不能為左值,即不能修改:

void fun1(const

intx)

關於const的用法就這四種,單獨記住const修飾成員變數,其他3個可以記住為「const fun(const) const」,乙個函式

前、中、後各乙個。還有在文中提出的頂層const,它的定義是指標本身的值不能改變,**上體現為「*」在const的左邊;那麼當「*」在cosnt的右邊時就稱為底層const,指標所指的物件不能改變。乙個變數可以即為頂層const也可以為底層const。例如:*const* int a。關於const之間的拷貝問題,自己雖然懂,但是沒有什麼大白話好說,所以暫時就不寫了,自己也是死記,才記住的。日後跟理解一點再擼一點感悟。

深入淺出C 中的引用

引用是c 引入的新語言特性,是c 常用的乙個重要內容之一,正確 靈活地使用引用,可以使程式簡潔 高效。一 引用簡介 引用就是某一變數 目標 的乙個別名,對引用的操作與對變數直接操作完全一樣。引用的宣告方法 型別識別符號 引用名 目標變數名 例1 int a int ra a 定義引用ra,它是變數a...

深入淺出Google ProtoBuf中的編碼規則

在開始本部分的內容之前,首先有必要介紹兩個基本概念,乙個是序列化,乙個是反序列化。這兩個概念的定義在網上搜一下都很多的,但大多都講得比較晦澀,不太好理解,在這裡我會用比較通俗的文本來解釋,盡可能讓讀都朋友們一讀就明白是怎麼回事 序列化 是指將結構化的資料按一定的編碼規範轉成指定格式的過程 反序列化 ...

深入淺出Google ProtoBuf中的編碼規則

在開始本部分的內容之前,首先有必要介紹兩個基本概念,乙個是序列化,乙個是反序列化。這兩個概念的定義在網上搜一下都很多的,但大多都講得比較晦澀,不太好理解,在這裡我會用比較通俗的文本來解釋,盡可能讓讀都朋友們一讀就明白是怎麼回事 序列化 是指將結構化的資料按一定的編碼規範轉成指定格式的過程 反序列化 ...