網易云課堂(Boolan)C++ 第五周筆記

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;

強烈建議在初始化時說明指針的指向,防止出現野指針!

-----------------------------------------------------------------------------以上部分來自百度百科

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容