CONST
C++中只有const對象調用對象內非const函數會不成功,所以能加const的盡量加const,而重載寫了兩個只有const差別的函數,則創建的const對象只調用const函數,創建的非const對象只調用非const函數。
一、主要作用
(1)可以定義const常量,具有不可變性。?
例如:const int Max=100; Max++會產生錯誤;?
(2)便于進行類型檢查,使編譯器對處理內容有更多了解,消除了一些隱患。
例如: void f(const int i) { .........} 編譯器就會知道i是一個常量,不允許修改;?
(3)可以避免意義模糊的數字出現,同樣可以很方便地進行參數的調整和修改。 同宏定義一樣,可以做到不變則已,一變都變!
(4)可以保護被修飾的東西,防止意外的修改,增強程序的健壯性。 還是上面的例子,如果在函數體內修改了i,編譯器就會報錯;?
例如: void f(const int i) { i=10;//error! }?
(5) 可以節省空間,避免不必要的內存分配。 例如:?
#define PI 3.14159 //常量宏?
const double Pi=3.14159; //此時并未將Pi放入RAM中 ......?
double i=Pi; //此時為Pi分配內存,以后不再分配!?
double I=PI; //編譯期間進行宏替換,分配內存?
double j=Pi; //沒有內存分配?
double J=PI; //再進行宏替換,又一次分配內存!?
const定義常量從匯編的角度來看,只是給出了對應的內存地址,而不是像#define一樣給出的是立即數,所以,const定義的常量在程序運行過程中只有一份拷貝,而#define定義的常量在內存中有若干份拷貝。?
(6) 提高了效率。?
編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。
二、指針指向及其指向變量的值的變化
const在*的左邊,則指針指向的變量的值不可直接通過指針改變(可以通過其他途徑改變);在*的右邊,則指針的指向不可變。簡記為“左定值,右定向”。
1)指針指向的變量的值不能變,指向可變
int x = 1;
int y = 2;
const int* px = &x;
int const* px = &x; //這兩句表達式一樣效果
px = &y; //正確,允許改變指向
*px = 3; //錯誤,不允許改變指針指向的變量的值
2)指針指向的變量的值可以改變,指向不可變
int x = 1;
int y = 2;
int* const px = &x;
px = &y; //錯誤,不允許改變指針指向
*px = 3; //正確,允許改變指針指向的變量的值
3)指針指向的變量的值不可變,指向不可變
int x = 1;
int y = 2;
const int* const px = &x;
int const* const px = &x;
px = &y; //錯誤,不允許改變指針指向
*px = 3; //錯誤,不允許改變指針指向的變量的值
補充
在c中,對于const定義的指針,不賦初值編譯不報錯,
int* const px;這種定義是不允許的。(指針常量定義的時候對其進行初始化)
int const *px;這種定義是允許的。(常指針可以再定義的時候不初始化)
但是,在C++中
int* const px;和const int* const px;會報錯,const int* px;不報錯。
必須初始化指針的指向int* const px = &x;const int* const px=&x;
強烈建議在初始化時說明指針的指向,防止出現野指針!
-----------------------------------------------------------------------------以上部分來自百度百科