const的那些小事

2021-06-16 13:22:09 字數 3435 閱讀 1312

關於const

為什麼需要const?

請看以下語句:

for(int index=0;index!=512;++index)

{……}

在此語句中有兩個問題:

1、512這個常量含義不明確,也並不清楚index與512比較有什麼作用

2、假如在程式中多次使用到512這個常量時,在後來的工作需要把512改為111的話修改的工作量將非常大

為此我們或許會想到定義乙個變數來儲存此常量

int bufsize=512;

for(int index=0;index!=

bufsize

;++index)

{……}

這樣,程式就能清楚表達出這個迴圈的作用,以及當需要修改這個常量的值時就在儲存這個常量的變數在其初始化時直接修改一次就可以了。

但此時又出現了新的問題,因為bufsize是乙個變數,程式隨時都可以對其重新賦值,但如果程式設計師需要bufsize內儲存的值恆定為512的話,程式不知道哪乙個操作把bufsize內儲存的值給改了,得出的結果就與預想的不一樣了。

由此我們用const限定符把乙個物件轉換成乙個常量,也就是說被const修飾的物件只能讀,不能修改其值。

對比:int bufsize=512; //在變數bufsize內存放著常量512

const int bufsize=512; //bufsize就是512,512就是bufsize。可以把bufsize看成512的乙個稱呼。「=」右邊是乙個常量

//定義bufsize為常量並初始化為512.變數bufsize仍然是乙個左值,但是這個左值是不可以修改

bufsize=0; //錯誤

注意:因為常量在定義以後就不能被修改,所以定義時必須初始化

const int i,j=0; //錯誤,i沒有初始化

當const遇上引用(&)

回顧一下引用:引用是別名,因為引用只是它繫結的物件的另乙個名字,作用在引用上的所有操作事實上都是作用在該引用繫結的物件。當引用初始化後,只要該引用存在,它就保持繫結到初始化時指向的物件。不可能將引用繫結到另一物件。

int i=9;

int &j=i; //注意引用"="右邊是乙個物件,「=」相當於繫結的意思。

int &k=10; //錯誤,引用繫結的是乙個物件

++j; //此時j=10,同時i=10

int &x; //錯誤,引用定義是一定要初始化,把它繫結到乙個物件

可以把引用理解會乙個指向恆定不變的指標的解引用(*)

即:int &j=i;//這裡「=」左邊是乙個引用,右邊是乙個變數i

相當於:int *const j=&i;//這裡「=」左邊是乙個指標,其指向恆定不變,右邊是變數i的位址

但實質上兩個本質上有差別

const引用

物件可分為const和非const:

int i=1; //非const物件

const int j=1; //const物件

那麼作為它的別名(引用)也應分為const和非const:

int &x=i; //非const引用繫結非const物件,此時,x和i的值都可以修改,因為兩個都是非const

const int &y=j; //const引用繫結const物件,此時,y和j的值都不能修改,因為兩個都是const

其實也可以把const引用繫結非const物件

const int &z=i;//此時z只能讀不能修改,但i可以修改,因為i本身不是乙個const物件

//可以理解為z是自以為const物件的別名

z=2; //錯誤

i=2;//ok

但不可以把非const引用繫結到const物件

const int a=1; //const物件

int &b=a;//錯誤,把非const引用繫結到const物件

也可以把乙個常量賦給const引用,但非const引用不可以

int &b=1; //error

const int &a=1;//ok

系統自動轉換成

int temp=1;

const int &a=temp;

當const遇上指標(*)

1、指向const物件的指標

同樣地,類似於引用指標也有指向const物件和指向非const物件之分。指向const物件的指標,const修飾的是指標變數所指向的物件(指標變數解引用後的內容),即指標變數所指向的內容不可以改變。

int a=1; //非const物件

const int b=1; //const物件

int *c=&a; //指向非const物件的指標,可以進行a++,c++,*c++

const int *d=&b; //指向const物件的指標,可以進行d++,不可以進行*d++,b++

也可以把乙個非const的物件賦給乙個指向const物件的指標

int x=1;

const int *y=&x;//此時可以進行y++,x++,但不可以進行*y++,可以理解y為自以為指向const物件的指標

不可以把乙個const的物件賦給乙個指向非const物件的指標

const int x=1; //const物件

int *y=&x; //錯誤

2、const指標

既然物件分為const和非const,指標變數作為一種物件相應地也應分為const和非const。const指標,const修飾的是指標變數,即指標變數恆定指向乙個位址。

int i=1;

int *p1=&i; //非const指標,可以進行i++,*p1++,p1++

int *const p2=&i; //const指標,可以進行i++,*p2++,但不可以進行p2++

指向const 物件的const指標

const int a=1;

const int *const pi=&a; //不能進行a++,*pi++,pi++

小結:或許可以這樣理解指向const物件的指標和const指標:

使用就近原則:

指向const物件的指標:把const int *p;看成const int (*p);  const修飾的是*p的內容

const指標:把int *const p;看成int *const (p);   const修飾的是指標變數p

後言:小的最近初學c++,若以上概念有錯,請各位大俠多多指教。。。

HTTP那些小事

這是一篇資訊整理文章,可以當作工具來看 http全稱是超文字傳輸協議,構建於tcp之上,屬於應用層協議。請求或響應在傳輸途中,遭攻擊者攔截並篡改內容的攻擊被稱為中間人攻擊 man in the middle attack,mitm https是在通訊介面部分用 tls transport layer...

談談React那些小事

而對於react的開發者來說,如何利用react構建現代化的前端專案,產出高質量的前端 才是學習react的重點。所以本文就我自己平時利用react開發專案的經驗和個人見解,來談談在react專案中需要了解和容易忽略的 小事 俗話說 千里之堤毀於蟻穴 在react開發中我們不能忙於進度而忽視了細節。...

談談React那些小事

說起react,那也是近一年多時間火起來的前端框架,其在facebook的影響力和大力推廣下,已然成為目前前端界的中流砥柱。在如今的前端框架界,react vue angular三分天下的時代已經到來,而曾經jquery一統天下的局面已一去不復返。而對於react的開發者來說,如何利用react構建...