const限定符:利用const對對象加以限定,使得const對象一旦創建後其值就不能再改變。
const對象在定義時就必須對其進行初始化,有兩種方式:
const int x = 10; const int x = getValue();
第一種是直接給對象賦值一個常量或常量表達式,以這種方式初始化的,編譯器會在編譯階段對所有的對象進行替換,如:把程序中所有出現x的地方都替換為10。
第二種方式是在運行時初始化,通過函數getValue()的返回值來初始化x。
默認情況下,const對象只在文件內有效,要在所有文件中使用同一個const對象可以在定義const對象時加上extern,並在其他文件中使用extern申明該const對象,如:
extern const int x = 10; //在main.cc中 定義const int類型對象,並初始化。 extern const int x; //在main.h中 申明const int類型對象。
初始化const引用時允許使用任意表達式作為初始值,如:
int x = 10; double y = 10.4; const int &r1 = x; const int &r2 = 10; const int &r3 = x * 10; const int &r4 = y;
int tmp = y; const int &r4 = tmp;
const的引用可以引用一個非const的對象,const的引用只是對引用可參與的操作做出限定,而對於引用的對象本身是不是一個const對象未做限定,如:
int x = 10; const int &r = x;
指向常量的指針:指的不能修改指針所指向的對象的值,指針本身的值可以改變,即可以重新指向別的對象,如:
const int x = 10; int y = 20; const int *p1 = &x; const int *p2 = &y; //指向常量的指針可以指向非常量 *p2 = 10; //錯誤,不能改變指向常量的指針所指向的對象的值,就算對象本身為非常量也不可以
int x = 10; int * const p = &x; //不能修改指針本身的值,只能修改指向所指對象的值 const int * const p2 = &x; //指向常量對象的常量指針,即不能修改所指對象的值,也不能修改指針本身的值
常量表達式是指值不會改變並且在編譯過程中就能得到計算結果的表達式。字面值屬於常量表達式,用常量表達式初始化的const對象也是常量表達式。一個對象(或表達式)是不是常量表達式由它的數據類型和初始值共同決定,只有const類型,且初始化值為常量表達式時,該對象才為常量表達式。
在一個復雜的系統中,很難分辨一個初始值到底是不是常量表達式,C++11中規定,允許將變量聲明為constexpr類型以便由編譯器來驗證變量的值是否是一個常量表達式。聲明為constexpr的變量一定是一個常量,而且必須用常量表達式初始化,如:
constexpr int mf = 20; // 20的常量表達式 constexpr int limit = mf + 1; // mf + 1是常量表達式 constexpr int sz = size(); // 只有當size()是一個constexpr函數時才是一條正確的聲明語句