C++數據類型(四)const常量

const常量

const常量:值無法被改變的變量

關于const的一些規則

//創建之后必須初始化
    const int bufSize = 1024;
    const int a = get_a();
    const int b;    //錯誤,沒有初始化
    bufSize = 1024; //錯誤,常量不能賦值

const的引用

  • 與可變變量的引用不同的是,對常量的引用,不能用作修改其所綁定的常量。
  • 初始化常量的引用時允許用表達式作為初始值,但左右兩邊類型相同,但變量不行
const int bufSize = 1024;
const int &a = 512; //錯誤,不能修改綁定的常量的值
const int &b = bufSize * 3; //正確
int &c = bufSize * 3;     //錯誤,非常量引用必須為左值

至于最后一條語句:使用表達式對變量引用報錯,解釋如下:
試想如下語句:

double d = 3.14;
const int &rd = d;

對于這種引用,編譯器工作如下:

double d = 3.14;
int temp = d;
const int &rd = temp;

rd只是綁定了一個臨時變量temp,如果rd不是常量是變量呢?那么就允許對rd賦值,但是對rd賦值改變的是臨時變量的值,之所以有變量引用,無非就是想通過引用改變綁定變量的值,如著名交換函數swap(),但是對于出現中間臨時變量的這種情況,無法達到上述要求,那么引用也無任何意義,所以,編譯器對于變量引用使用表達式初始化報錯。

指針和const
與常量的引用類似,也存在指向常量的指針,同樣也不能通過指針改變常量的值。

const int a = 4;
int *b = &a;
  • const指針
    與引用不同,指針是作為對象出現的,允許把指針作為常量,即常量指針。同樣,常量指針必須初始化,一旦初始化成功,不能修改,指針常量的定義如下:
#include<iostream>
using namespace std;
int main() {
    int bufSize = 1024;
    int bufSize2 = 512;
    //定義一個常量指針
    int *const rbuf = &bufSize;
    //rbuf = &bufSize2; //錯誤:表達式必須是可修改的左值
    cout << *rbuf << endl;
    bufSize = 2048;
    cout << *rbuf << endl;
    system("pause");
    return 0;
}
//輸出結果
1024
2048

關于常量的引用或者指向常量的指針,一直搞不明白有什么用,既然不能那個改變,為什么還可以引用或者使用指針呢?

constexpr和常量表達式

常量表達式指不會改變而且在編譯過程中就能計算出結果的表達式
字面值屬于常量表達式,用常量表達式初始化的常量也是常量表達式。

const int num = 20;             //num是常量表達式
const int number = num + 1;     //number也是常量表達式
int a = 3;                      //a不是常量表達式
const int size = size();        //size不是常量表達式

C++11新標準:
允許將變量聲明為constexpr類型,編譯器驗證變量是否是一個常量表達式

constexpr int num = 20;             //num是常量表達式
constexpr int number = num + 1;     //number也是常量表達式
constxpr int size = size();         //size不一定常量表達式,size()是constexpr函數時,語句正確

同樣的,constexpr對于指針同樣有效,相當于聲明了一個常量指針

const int *p = nullptr;            //p是指向整型常量的指針
constexpr int *q = nullptr;       //q是常量指針
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容