程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ const限定符

C++ const限定符

編輯:C++入門知識

C++ const限定符


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類型。

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved