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是常量指針