壹、const int 和int 的區別
1、返回值
const int & 是返回這個數值的壹個常量的引用。
而int 是返回這個數值的壹個拷貝。
int 是進行拷貝構造,而const int & 是返回的引用。拷貝構造更消耗時間,與此同時還用析構函數。因為產生了壹個拷貝,妳就可以輕易地修改拷貝的內容。
2、取指針
const int類型壹旦定義以後就不能修改,int類型是隨時可以修改的。
在取指針方面,const有略復雜的東西,但是常規的、合理的操作不應該涉及到,因為const int是用來保存壹些全局常量的,這些常量在編譯期可以改,在運行期不能改。
聽起來這像宏,其實這確實就是用來取代宏的: #define PI 3.14 const float Pi = 3.14; 如果妳的代碼裏用到了100次PI(宏),妳的代碼中會保存100個3.14這個常數。
鑒於使用常數進行運算的機器代碼很多時候會比使用變量來的長,如果妳換用100次Pi(const float),程序編譯後的機器碼裏就不需要出現100次常量3.14,只要在需要的時候引用存有3.14的常量就行了。
特別在復雜的運算裏,3.14這個常量(其實是無法修改的變量)會被壹直裝載在寄存器裏帶來壹些性能提升。
3、內容
constint* p; //p可變,p指向的內容不可變,int const* p; //p可變,p指向的內容不可變。?int* const p; //p不可變,p指向的內容可變?const int* const p; //p和p指向的內容都不可變。
二、const的作用:
1、可以定義const常量,具有不可變性。?
例如:const int Max=100; Max++會產生錯誤;?
2、便於進行類型檢查,使編譯器對處理內容有更多了解,消除了壹些隱患。
例如: void f(const int i) { .........} 編譯器就會知道i是壹個常量,不允許修改;?
3、可以避免意義模糊的數字出現,同樣可以很方便地進行參數的調整和修改。 同宏定義壹樣,可以做到不變則已,壹變都變!
如1中,如果想修改Max的內容,只需要它修改成:const int Max=you want;即可!
4、可以保護被修飾的東西,防止意外的修改,增強程序的健壯性。 還是上面的例子,如果在函數體內修改了i,編譯器就會報錯;?
例如: void f(const int i) { i=10;//error! }?
5、可以節省空間,避免不必要的內存分配。
擴展資料
當const修飾的是指針類型,那麽指針的值就不能改變,即不能指向其他地址,但是可以通過指針修改其指向地址裏面的值。
當const修飾時指針指向的類型時候,那麽指針被指向其他地址,但是不能通過指針修改指針裏面的值。
1)先從const int i說起。
使用const修飾的i我們稱之為符號常量。即,i不能在其他地方被重新賦值了。註意:const int i與int const i是等價的,相同的,即const與int的位置無所謂。
2)const int *p
看例子:
int i1=30;
int i2=40;
const int *p=&i1;
p=&i2; ?//此處,p可以在任何時候重新賦值壹個新的內存地址。
i2=80; ?//這裏能用*p=80來代替嗎?答案是不能
printf("%d",*p); ?//輸出80
分析:p的值是可以被修改的,即它可以重新指向另壹個地址。但是不能通過*p來修改i2的值。
首先,const修飾的是整個*p(註意,是*p而不是p),所以*p是常量,是不能被賦值的。雖然p所指的i2是變量而不是常量;
其次,p前並沒有用const修飾,所以p是指針變量。能被賦值重新指向另壹個內存地址。
參考資料: