本文寫作時長4小時
const
是一種限定符羹呵,對變量的類型加以限定骂际,使其成為不可變的變量,也就是常量冈欢。在這里歉铝,有必要說明一下,本文討論的變量和常量并不完全對立涛癌。C++中犯戏,所有具名的、可供程序操作的存儲空間拳话,統(tǒng)稱為變量(variable)
先匪,常量就是加了限定符const
的變量。
由于const
是對變量的類型加以限定弃衍,所以我們主要從變量類型入手分類討論
const限定基本內(nèi)置類型
C++基本內(nèi)置類型包含算術(shù)類型和void類型呀非,算術(shù)類型就是老生常談的整型和實型,不往下細說了
定義一個const變量(常量):
const int bufferSize = 128;//常量定義時必須要初始化
bufferSize = 256;//錯誤镜盯,常量初始化后岸裙,不可賦值
常量的初始化時機有兩種:
const int bufferSize = 128;//編譯時初始化
const int bufferSize = buffer_size();//運行時初始化
這種const
很簡單,直來直去
const限定復(fù)合類型
復(fù)合類型包括引用速缆,指針等降允,暫時只討論這兩種
const和引用
在談?wù)?code>const和引用之前,一定要明白艺糜,引用本身不是變量剧董,不是對象幢尚,初始化引用就是把引用和初始值綁定在一起,而非拷貝翅楼。引用即別名(一個已經(jīng)存在的變量的另外一個名字)尉剩。引用的類型由它所引用的類型決定。
對非const變量的引用(普通引用)
int i = 1;
int &ri = i;
對const變量(常量)的引用(引用常量的引用)
const int i = 1;
const int &ri = i;
被const
修飾的引用我們稱之為常引用毅臊,這其實是不準確的理茎,因為常引用從字面上理解,就是不能再次引用其他變量的引用管嬉,這很容易引起誤解皂林,因為引用本身就是這樣的特點,所以本文不稱為常引用蚯撩,叫引用常量的引用式撼,或者稱作只讀引用。
引用常量的引用意義在于求厕,不能通過這個引用修改引用綁定的變量的值。
假如用普通引用引用const變量(常量)
const int i = 1;
int &ri = i;//錯誤扰楼,i是常量呀癣,ri必須是常引用
這個例子就是,我說了弦赖,這個值不能變项栏,而你卻總想動個歪腦筋,說這個值可以變蹬竖,你幾個意思沼沈,給我乖乖加上const!
假如用引用常量的引用引用非const變量
int i = 1;
const int &ri = i;
i
是變量币厕,而ri
本身的意思卻是引用一個常量列另,這樣是可以的,只是通過ri
無法改變i
的值旦装,而通過i
還是可以改變自身的值页衙。這樣做的唯一影響的就是無法通過引用改變綁定變量的值。ri
自以為是的認為所綁定的變量是個常量阴绢。
那么店乐,經(jīng)過實踐,我們下一個結(jié)論:
雖然只讀引用是對常量的引用呻袭,但是編譯器不會阻止你用只讀引用引用變量眨八,這么做的唯一影響就是通過這個常引用無法修改綁定變量的值,也就是說只讀引用中的const只對引用進行限定左电。但是別搞混了廉侧,引用常量必須用只讀引用页响。
const和指針
普通指針
int i = 1;
int *pi = &i;
i
自身是變量,通過指針pi
也可以修改i
的值伏穆,pi也可以再次指向其他變量
指向const變量的指針
const int i = 1;
const int *pi = &i;
判斷一個變量的類型時拘泞,從變量名從右向左看,首先枕扫,*
指示pi
是一個指針陪腌,const int
指示pi
是一個指向const
變量的指針。和引用類型一樣烟瞧,指向const變量的指針必須被聲明為const
(*號左側(cè))诗鸭,pi仍然可以再次指向其他變量。
用普通指針指向const
類型
const int i = 1;
int *pi = &i;
居心叵測参滴,行為不良强岸!為了避免嫌疑,請加上const
用只讀指針指向非const變量
int i = 1;
const int *pi = &i;
比較自覺砾赔,一身正氣蝌箍,有原則,唯一影響就是pi
是個只讀指針
const指針
指針和引用不同暴心,指針本身是個變量(對象)妓盲,可以定義const指針,也就是常量指針
int i = 1;
int j = 2;
int * const pi = &i;//pi永遠指向i
pi = &j;//錯誤专普,指向i了就不能再指向別的變量了
同樣地悯衬,從右向左讀,pi
是變量名檀夹,const
修飾pi
筋粗,表明pi
本身是一個常量,int *
指示pi
是一個指向int
的常量指針炸渡。雖然不能再次指向別的變量娜亿,但是可以通過這個指針修改指向的變量值。
指向常量的常量指針
const int i = 1;
const int * const pi = &i;
pi
自身是常量偶摔,指向也是常量
總結(jié):
-
const
修飾基本類型時暇唾,const
變量不可修改(再次被賦值) -
const
修飾引用時,const
引用(命名不準確辰斋,只讀引用比較合適)可以引用常量和變量策州,只是無法通過只讀引用去修改值,而常量只能被只讀引用引用宫仗。(由于引用非變量够挂,所以不存在const
引用,又或者說引用本身就是const
) -
const
修飾指針時藕夫,const
指針(常量指針)不可以再次指向其他變量孽糖,但是可以修改指向的變量的值枯冈,而指向const
變量的指針,不可以通過指針修改指向變量的值办悟,但是可以再次指向其他的變量尘奏。而指向const
變量的const
指針則什么都不能改變了。
說明:只讀指針 指不能通過這個指針修改指向的內(nèi)容