const常量
const常量:值無法被改變的變量
關(guān)于const的一些規(guī)則
//創(chuàng)建之后必須初始化
const int bufSize = 1024;
const int a = get_a();
const int b; //錯(cuò)誤挑胸,沒有初始化
bufSize = 1024; //錯(cuò)誤猴凹,常量不能賦值
const的引用
- 與可變變量的引用不同的是夷狰,對(duì)常量的引用,不能用作修改其所綁定的常量郊霎。
- 初始化常量的引用時(shí)允許用表達(dá)式作為初始值沼头,但左右兩邊類型相同,但變量不行
const int bufSize = 1024;
const int &a = 512; //錯(cuò)誤书劝,不能修改綁定的常量的值
const int &b = bufSize * 3; //正確
int &c = bufSize * 3; //錯(cuò)誤进倍,非常量引用必須為左值
至于最后一條語句:使用表達(dá)式對(duì)變量引用報(bào)錯(cuò),解釋如下:
試想如下語句:
double d = 3.14;
const int &rd = d;
對(duì)于這種引用购对,編譯器工作如下:
double d = 3.14;
int temp = d;
const int &rd = temp;
rd只是綁定了一個(gè)臨時(shí)變量temp背捌,如果rd不是常量是變量呢?那么就允許對(duì)rd賦值洞斯,但是對(duì)rd賦值改變的是臨時(shí)變量的值,之所以有變量引用坑赡,無非就是想通過引用改變綁定變量的值烙如,如著名交換函數(shù)swap(),但是對(duì)于出現(xiàn)中間臨時(shí)變量的這種情況毅否,無法達(dá)到上述要求亚铁,那么引用也無任何意義,所以螟加,編譯器對(duì)于變量引用使用表達(dá)式初始化報(bào)錯(cuò)徘溢。
指針和const
與常量的引用類似,也存在指向常量的指針捆探,同樣也不能通過指針改變常量的值然爆。
const int a = 4;
int *b = &a;
- const指針
與引用不同,指針是作為對(duì)象出現(xiàn)的黍图,允許把指針作為常量曾雕,即常量指針。同樣助被,常量指針必須初始化剖张,一旦初始化成功,不能修改揩环,指針常量的定義如下:
#include<iostream>
using namespace std;
int main() {
int bufSize = 1024;
int bufSize2 = 512;
//定義一個(gè)常量指針
int *const rbuf = &bufSize;
//rbuf = &bufSize2; //錯(cuò)誤:表達(dá)式必須是可修改的左值
cout << *rbuf << endl;
bufSize = 2048;
cout << *rbuf << endl;
system("pause");
return 0;
}
//輸出結(jié)果
1024
2048
關(guān)于常量的引用或者指向常量的指針搔弄,一直搞不明白有什么用,既然不能那個(gè)改變丰滑,為什么還可以引用或者使用指針呢顾犹?
constexpr和常量表達(dá)式
常量表達(dá)式指不會(huì)改變而且在編譯過程中就能計(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)證變量是否是一個(gè)常量表達(dá)式
constexpr int num = 20; //num是常量表達(dá)式
constexpr int number = num + 1; //number也是常量表達(dá)式
constxpr int size = size(); //size不一定常量表達(dá)式哄芜,size()是constexpr函數(shù)時(shí),語句正確
同樣的柬唯,constexpr對(duì)于指針同樣有效认臊,相當(dāng)于聲明了一個(gè)常量指針
const int *p = nullptr; //p是指向整型常量的指針
constexpr int *q = nullptr; //q是常量指針