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

const常量

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

關(guān)于const的一些規(guī)則

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

const的引用

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

至于最后一條語句:使用表達(dá)式對變量引用報(bào)錯,解釋如下:
試想如下語句:

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

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

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

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

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

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

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

constexpr和常量表達(dá)式

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

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

C++11新標(biāo)準(zhǔn):
允許將變量聲明為constexpr類型,編譯器驗(yàn)證變量是否是一個常量表達(dá)式

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

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

const int *p = nullptr;            //p是指向整型常量的指針
constexpr int *q = nullptr;       //q是常量指針
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容