1. 程式人生 > >C++ const限定符

C++ const限定符

情況 value 一次 返回值 常量指針 pop 一個 exp 得到

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的引用:

初始化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;

對於後三種情況,事實上r是綁定了一個暫時量,編譯器會將代碼變成例如以下:

int tmp = y;
const int &r4 = tmp;

此時不能改變r4的值,改變y時,r4的值也不會隨之改變,由於r4是一個暫時量的引用。


const的引用能夠引用一個非const的對象。const的引用僅僅是對引用可參與的操作做出限定,而對於引用的對象本身是不是一個const對象未做限定,如:

int x = 10;
const int &r = x;

指針和const:

指向常量的指針:指的不能改動指針所指向的對象的值,指針本身的值能夠改變,即能夠又一次指向別的對象,如:

const int x = 10;
int y = 20;
const int *p1 = &x;
const int *p2 = &y;  //指向常量的指針能夠指向很量 
*p2 = 10;            //錯誤,不能改變指向常量的指針所指向的對象的值,就算對象本身為很量也不能夠

const指針:即常量指針,定義時就必須初始化,且之後不能再將該指針指向其它對象,但能夠通過該指針改動所指向的對象的值。如:

int x = 10;
int * const p = &x;     //不能改動指針本身的值。僅僅能改動指向所指對象的值
const int * const p2 = &x; //指向常量對象的常量指針,即不能改動所指對象的值,也不能改動指針本身的值

constexpr和常量表達式:

常量表達式是指值不會改變而且在編譯過程中就能得到計算結果的表達式。字面值屬於常量表達式。用常量表達式初始化的const對象也是常量表達式。一個對象(或表達式)是不是常量表達式由它的數據類型和初始值共同決定,僅僅有const類型。且初始化值為常量表達式時,該對象才為常量表達式。

在一個復雜的系統中,非常難分辨一個初始值究竟是不是常量表達式,C++11中規定。同意將變量聲明為constexpr類型以便由編譯器來驗證變量的值是否是一個常量表達式。

聲明為constexpr的變量一定是一個常量,並且必須用常量表達式初始化,如:

constexpr int mf = 20;           // 20的常量表達式
constexpr int limit = mf + 1;    // mf + 1是常量表達式
constexpr int sz = size();       // 僅僅有當size()是一個constexpr函數時才是一條正確的聲明語句

一般來說,假設你認定變量是一個常量表達式,那就把它聲明成constexpr類型。

C++ const限定符