【 聲明:版權所有,歡迎轉載,請勿用於商業用途。 聯系信箱:feixiaoxing @163.com】
const是C/C++語言中的關鍵字,但是如果用的好,可以極大地提高代碼的健壯性。一般來說const使用的地方還是蠻多的,但是主要還是下面幾個地方:(1)普通變量的保護;(2)地址空間的保護;(3)類初始變量的聲明和保護;(4)類變量在函數中的保護。const的保護主要來自於編譯器層面,和程序的運行沒有關系。
(1)普通變量的保護
const int data = 10;
const char str = 'a';
const double pi = 3.14;
const int data = 10;
const char str = 'a';
const double pi = 3.14;
上面的代碼就是一組全局變量的定義,如果在函數中變量發生了修改,那麼代碼就會編譯失敗。
(2)地址空間的保護
void process()
{
int value = 10;
const int* address = &value;
}
void process()
{
int value = 10;
const int* address = &value;
}
和上面代碼不一樣的地方就是,這裡如果address地址指向的數值發生了改變,那麼那麼代碼就會編譯失敗?大家可以在函數結束前添加*address = 100;試試看?
(3)類const成員變量的定義
class desk
{
const int price;
public:
desk():price(10){}
~desk() {}
};
class desk
{
const int price;
public:
desk():price(10){}
~desk() {}
}; const成員變量 就是在類變量定義的時候前面添加const關鍵字。和普通的成員變量不一樣,const變量在構造函數中一定要初始化操作的。如果沒有const關鍵字,那麼在構造函數內部就無所謂是不是需要初始化了。
(4)類const函數
class desk
{
int price;
public:
desk() {}
~desk() {}
void print() {return;}
void print() const {return;}
};
class desk
{
int price;
public:
desk() {}
~desk() {}
void print() {return;}
void print() const {return;}
}; 那麼desk裡面的print和print() const函數是不是一樣的呢?大家可以看一下這個代碼:
53: desk m;
0040122D lea ecx,[ebp-10h]
00401230 call @ILT+75(desk::desk) (00401050)
00401235 mov dword ptr [ebp-4],0
54: m.print();
0040123C lea ecx,[ebp-10h]
0040123F call @ILT+70(desk::print) (0040104b)
55: const desk n;
00401244 lea ecx,[ebp-14h]
00401247 call @ILT+75(desk::desk) (00401050)
0040124C mov byte ptr [ebp-4],1
56: n.print();
00401250 lea ecx,[ebp-14h]
00401253 call @ILT+65(desk::print) (00401046)
57: }
53: desk m;
0040122D lea ecx,[ebp-10h]
00401230 call @ILT+75(desk::desk) (00401050)
00401235 mov dword ptr [ebp-4],0
54: m.print();
0040123C lea ecx,[ebp-10h]
0040123F call @ILT+70(desk::print) (0040104b)
55: const desk n;
00401244 lea ecx,[ebp-14h]
00401247 call @ILT+75(desk::desk) (00401050)
0040124C mov byte ptr [ebp-4],1
56: n.print();
00401250 lea ecx,[ebp-14h]
00401253 call @ILT+65(desk::print) (00401046)
57: }
上面是一段函數調用的代碼。我們在53行和55行定義了desk類型的變量m和n。接著在54行和56行,我們分別利用兩個變量調用print函數進行處理,我們發現兩個調用的函數地址並不一樣,其中一個是0x0040104b,另外一個是0x00401046,我們可以繼續跟進去看一下:
00401046 jmp desk::print (00401310)
0040104B jmp desk::print (004012e0)
00401046 jmp desk::print (00401310)
0040104B jmp desk::print (004012e0)
這裡雖然是兩個跳轉函數,但是事實已經證明這裡的兩個函數確實是不一樣的,這也證明了我們的判斷是正確的。