const物件一旦建立後其值就不能再改變,所以const物件必須初始化。
**初始化和const**
如果利用乙個物件去初始化另外乙個物件,則它們是不是const都無關緊要。
**預設狀態下,const物件僅在檔案內有效**
如果想在多個檔案之間共享const物件,必須在變數的定義前新增extern關鍵字。
1.const的引用
可以把引用繫結到const物件上,就像繫結到其他物件上一樣,我們稱之為對常量的引用。對常量的引用
不能被用作修改它所繫結的物件:
const
int ci =1024;
const
int &r1 = ci; //正確:引用及其對應的物件都是常量
r1 = 42; //錯誤:r1是對常量的引用
int &r2 = ci; //錯誤:試圖讓乙個非常量引用指向乙個常量物件
**初始化和對const的引用**
引用的型別必須與其所引用物件的型別一致,有例外:初始化常量引用時,允許用任意表示式作為初始值,
只要該表示式的結果能轉換成引用的型別即可(即初始化常量引用,可以用表示式及其他任意形式,但其結果能轉
換成引用的型別就可以)。
**對const的引用可能引用乙個並非const的物件**:常量引用僅對引用可參與的操作做出了限定,對於引用的物件本身
是不是乙個常量未做限定。
2.指標和const
指向常量的指標不能用於改變其所指物件的值。要想存放常量物件的位址,只能使用指向常量的指標。
**const指標**
常量指標必須初始化,而且一旦初始化完成,則它的值(即存放在指標中的位址)就不能再改變。
把*放在關鍵字const之前,說明指標是乙個常量,即不變的是指標本身的值而不是指向的那個值。
int errnumb = 0;
int *const curerr = &errnumb; //curerr將一直指向errnumb
const
double pi = 3.14159;
const
double *const pip = π //pip是乙個指向常量物件的常量指標
弄清楚這些宣告,最有效的方法是從右向左閱讀。以最後一句為例,const說明pip是常量物件,帶*說明其為常量
指標,double說明該指標指向的物件為雙精度,const說明該指標指向的物件為雙精度常量,因此pip為指向雙精度常量
的常量指標。
指標本身是乙個常量,並不意味著不能通過指標修改其所指物件的值,能否這樣做完全依賴於所指物件的型別。
相反的,curerr指向的是乙個一般的非常量整數,那麼就完全可以用curerr去修改errnumb的值。
*pip = 2.72; //錯誤:pip是乙個指向常量的指標
//如果curerr所指的物件(也就是errnumb)的值不為0
if (*curerr)
3.頂層const
**頂層const**: 頂層const表示指標本身是乙個常量,底層const表示指標指向的物件是乙個常量。
int i =0;
int *const p1 = &i; //不能改變p1的值,這是乙個頂層const
const
int ci =42 ; //不能改變ci的值,這是乙個頂層const
cosnt int *p2 = &ci; //允許改變p2的值,這是乙個底層const
const
int *const p3 = p2; //靠右的const是頂層const,靠左的是底層const
const
int &r = ci; //用於宣告引用的const都是底層const
當執行物件的拷貝操作時,頂層const不受什麼影響,而底層const的限制卻不能忽視。當執行物件的拷貝操作時,
拷入和拷出的物件必須具有相同的底層const資格,或者兩個物件的資料型別必須能夠轉換。一般來說,非常量可以轉換成
常量,而反之則不行。
int
*p = p3; //錯誤:p3包含底層const的定義,而p沒有
p2 = p3; //正確:p2和p3都是底層const
p2 = &i; //正確:int
*能轉換成const int*
int &r = ci; //錯誤:普通的int&不能繫結在int常量上
const int &r2 = i; //正確:const int& 可以繫結到乙個普通int上
4.常量表示式和constexpr
常量表示式是指值不會改變並且在編譯過程中能得到計算結果的表示式。乙個物件(或者表示式)是不是常量表示式由
它的資料型別和初始值共同決定的。
**constexpr**
一般來說,如果你認定變數是乙個常量表示式,那就把它宣告成constexpr型別。
**字面值型別**
常量表示式的值需要在編譯時就得到計算,因此對宣告constexpr時用到的型別必須有所限制,比如:算術型別、引用
和指標等,此職位字面值型別。
**指標和constexpr**
在constexpr宣告中,如果定義了乙個指標,限定符constexpr對指標有效,與指標所指的物件無關:
const int *p = nullptr; //p是乙個指向整型常量的指標
constexpr int *q = nullptr; //q是乙個指向整數的常量指標(const把它所定義的物件置為了頂層const)
與其他常量指標類似,cosntexpr指標既可以指向常量也可以指向非常量:
constexpr
int *np = nullptr; //np是乙個指向整數的常量指標,其值為空
int j = 0;
constexpr
int i =42; //i的型別為整形常量
//i和j都必須定義在函式體之外
constexpr
const
int *p = &i; //p是常量指標,指向整型常量i
constexpr
int *p1 = &j; //p1是常量指標,指向整數j
關於const 限定符
很多引用自c primer一書 比如有時候需要將乙個文字中的資料複製到另外乙個文字。我們需要使用緩衝區,緩衝區的大寫我們可以自己來決定比如1024個位元組,這是乙個常量,我們使用bufsize 1024.但是bufersize物件本身是乙個變數。所以我們可以引入const限定符,它將乙個物件轉化為常...
異常,const限定符
異常 1.掌握語句 throw 用於丟擲異常資訊,交出 控制權,一旦丟擲資訊,被catch子句捕獲到異常資訊,的控制權就轉移到對應的子句上了。丟擲多種資料型別。catch捕獲 try 這個語句上執行可能出現異常的 塊,如果有異常,可以搭配throw語句。catch 捕獲異常,搭配try語句使用。in...
const 型別限定符
1.以const關鍵字宣告的物件,其值不能通過賦值或遞增 遞減來修改。例 const int a 限定a的值不能被修改 a 12 不允許 2.在指標中使用const const float pf pf指向乙個float型別的const,建立了pf指向的值不能更改 float const pt pt是...