定義:html
const 主要用於聲明常量。當常量爲對象時,對象值不可改變;當常量爲指針時,該指針不可移動或從新賦值,但咱們能夠經過它去修改該指針的指向對象的值(前提是無需移動指針的修改)。所謂的形參、返回值、成員變量均是變量,所以當const修飾他們時,亦屬於常量範疇。不過常成員變量必須在類的構造函數的初始化列表中進行初始化。安全
const 還可用於聲明類的常成員函數。該常成員函數不能修改類中任何非const成員變量及調用非const成員函數。函數
語法格式:spa
常量爲對象時:指針
const Type M=常量值(表達式)或Type const M=常量值(表達式);htm
const Type *M=指針對象地址或Type const *M=指針對象地址;對象
常量爲指針(常指針)時:blog
Type * const M=指針對象地址;內存
理解該語法格式先要了解類型修飾符的優先級及結合方向的幾個概念。const 是一個左結合的類型修飾符,它與其左側的類型修飾符合爲一個類型。* 是一個右結合的指針類型修飾符,&是一個右結合的引用類型修飾符,二者處於同一優先級。[]優先級比*高,因此當變量中含有[]時,M一般先和[]結合。聲明的結合開始點爲變量名M。所以,const 放在Type先後是無區別的,但當const放在指針符*左側時const與type結合,則表示修飾的是指針內容.當const放在指針符*右側時const與*結合,則表示修飾的是指針自己。相似的結合應用於&。get
類的常成員函數時:
返回值 函數名(形參)const;
做用:
使編譯器很天然地保護那些不但願被改變的參數,防止其被無心的代碼修改。簡而言之,加強程序的健壯性,減小bug的出現。
與define區別:
(1) 編譯器處理方式不一樣
define宏是在預處理階段展開。
const常量是編譯運行階段使用。
(2) 類型和安全檢查不一樣
define宏沒有類型,不作任何類型檢查,僅僅是展開。
const常量有具體的類型,在編譯階段會執行類型檢查。
(3) 存儲方式不一樣define宏僅僅是展開,有多少地方使用,就展開多少次,不會分配內存。const常量會在內存中分配(能夠是堆中也能夠是棧中)。