注意以下幾種修飾的區別:
(1)const int * a;
(2)int const *a;
(3)int * const b;
(4)int const* const c;
其中前兩種指a是一個指向const int變量的指針;(3)b是一個const型的指向int變量的指針;(4)c是一個const型的指向const int變量的指針。
2修飾函數形參變量/指針/引用
如
void fun(const a,const* b,const& c)
指形參a和b、c在函數fun內是不可以被改變的。
其實對變量a來說,const對它沒有任何意義,因爲a作爲形參,本來就是實參的一個複製品,它的改變與否與實參沒有任何影響。更常用的是修飾指針或變量,這樣會使得函數的使用者無法改變實際指向/引用的變量,保證了安全性。
3修飾函數返回值
如
const int fun1()
const int* fun2()
const int& fun3()
這種用得不是很多,作用類似於修飾變量,返回一個const型的變量
4修飾類對象/指針/引用
如
const classA a;
const classB* b;
const classC& c;
(1)不能改變對象的任何成員變量
(2)不能調用任何非const成員函數
5修飾類成員變量
(1)不能被修改
(2)只能在類初始化列表中被賦值
小總結:只能在類初始化列表中被賦值的情況:
(1)const成員變量
(2)引用變量
(3)基類構造函數
6修飾類成員函數
如
void fun() const;
(1)不能修改類的任何非靜態數據成員(可以修改靜態數據成員);
(2)不能調用類的任何非const函數(可以調用const成員函數)。
const常量與define宏定義的區別
(1) 編譯器處理方式不同
define宏是在預編譯階段展開。
const常量是編譯運行階段使用。
(2) 類型和安全檢查不同
define宏沒有類型,不做任何類型檢查,僅僅是展開。
const常量有具體的類型,在編譯階段會執行類型檢查。
(3) 存儲方式不同
define宏僅僅是展開,有多少地方使用,就展開多少次,不會分配內存。
const常量會在內存中分配(可以是堆中也可以是棧中)。