const定義常量
在c語言中,我們學(xué)習(xí)過可以使用#define來定義常量。但是#define的原理是簡單的替換,因此對于#define來說沒有類型檢查這回事。
c++中提供了const關(guān)鍵字,用const關(guān)鍵字修飾的變量其值是不能修改的,因此可以使用const關(guān)鍵字來替換#define,這有益于編譯器進(jìn)行類型檢查。
const關(guān)鍵字定義變量如下代碼所示:
#include<iostream>
using namespace std;
const int MAX = 1000;
const double PI = 3.14;
const char NAME[] = "yurui";
int main() {
MAX = PI;//報錯
int a = PI;//警告
return 0;
}
如上程序所示,使用const關(guān)鍵字定義了MAX、PI、NAME三個全局變量。
通過MAX = PI;對const修飾的變量進(jìn)行賦值時會報錯;通過int a = PI;進(jìn)行賦值時編譯系統(tǒng)會給出警告,提示類型不符合。
通過上面的例子,我們可以看出,通過使用const關(guān)鍵字修飾常量,在使用時編譯系統(tǒng)會進(jìn)行類型檢查。
const定義常量指針
通過const關(guān)鍵字定義常量指針,這樣就不能通過指針修改變量的值。
例如:
#include<iostream>
using namespace std;
int main() {
int a = 10;
const int* p = &a;
*p = 10;//報錯
a = 100;//正確
return 0;
}
如上面的程序,定義常指針p,當(dāng)我們通過p去修改其所指向的值時,編譯器就會對其報錯。
但通過變量名還是可以修改其值,如a = 100;。
另外,觀察下面代碼:
#include<iostream>
using namespace std;
int main() {
const int* a;
int* b;
a = b;//正確
b = a;//錯誤
return 0;
}
對于常指針,我們可以直接對其賦值,如a = b;;對于非常量指針,我們不能使用常量指針對其進(jìn)行賦值,如b = a;。
const修飾引用對象
引用也可以用const關(guān)鍵字修飾,這樣就不能通過引用名來修改變量值了。
如下代碼所示:
#include<iostream>
using namespace std;
int main() {
int a = 10;
const int& r = a;
a = 10;//正常
r = 10;//報錯
}
在執(zhí)行到r=10;這條語句時編譯器會報錯,提示表達(dá)式必須是可修改的左值,因為我們再初始化引用時將其加上了了const關(guān)鍵字,我們就不能通過引用名來修改變量的值了。
對于a = 10;這條語句則執(zhí)行正常,因為a沒有const關(guān)鍵字修飾。
再考量下面的代碼:
#include<iostream>
using namespace std;
int main() {
const int a = 10;
const int& b = a;//正確
int& r = a;//錯誤
r = 100;//錯誤
a = 100;//錯誤
return 0;
}
對于用const關(guān)鍵字修飾的變量,我們在為其創(chuàng)建引用對象時,任然需要創(chuàng)建const類型的引用對象,且無法通過變量名或引用名來修改變量的值。