Mutable&const&volatile&extern&Static

1、Mutable

使用mutable關鍵字後,即使上下文環境在const函數中,或者當前爲const對象,也可以修改被修飾的值

Mutable int counter;

2、const&volatile

const修飾的值不能被當前程序上下文修飾,但是可能在其他環境中被修改,如系統

volatile(基於多線程的考慮)修飾的變量在每次訪問的時候都要去相應的內存地址取值,因爲隨時可能改變

這兩個關鍵字同時修飾的時候並不矛盾,順序也不重要


例如:

unsigned char flag = 1;

int main(int argc, char **argv) {

reg_intr(XXX, intr_func);

while(flag){

printf("hello\n");

}

return 0;

}

void intr_func(void) {

flag = 0;

}

unsigned char flag不加volatile時,編譯器會優化處理將while條件中flag的值1放在緩存中,每次都從緩存中取,因此循環會一直運行

當加上volatile後,每次取值都直接取對應地址上的值,那麼當發生reg_intr(XXX, intr_func);這個事件時,就會改變flag值,那麼就會去到改變後的值,最後退出while循環

3、const

http://blog.163.com/lee_020/blog/static/1247556020120235742444/ const的思想

const並不能把變量變成常量,只是表示不能通過這個被const修飾的符號來修改這個符號對應值,但是並不能防止我們通過其他方法來修改這個值

<1>重載和覆蓋:

(1)重載時加上表示同一函數,但是兩個函數可以並存,因爲const對象不能調用非const函數(這個很重要)

(2)覆蓋(多態),則表示不同的函數(參數類型不同),這時達不到多態效果

<2>限定變量:

(1)把一個對象轉換成一個常量,聲明的時候需要初始化,賦值後不能再次賦值了

(2)在全局作用域聲明的變量在整個程序中都可以被訪問,但是加了const修飾後卻是定義該對象文件的局部變量,只能存在於這個文件中,不能被其他文件訪問(沒有添加extern的情況下,這個類似static修飾的全局變量,加上extern就可以被其他文件共享)

如:

file_1.cpp:extern const int counter = 100;

file_2.cpp:extern const int counter;++counter;

   <3>

       class A
                  {
                       ......
                       void f(int i) {......} file://個函數
                       void f(const int i) {......} file://error
                       ......
                   };

    按值傳遞時,對用戶而言,這是透明的,用戶不知道函數對形參做了什麼手腳,在這種情況下進行重載時沒有意義的,所以規定不能重載;當指針或引用被引入時,用戶就會對函數的操作有一定的瞭解,不再是透明的了,這時重載是有意義的,所以規定可以重載

<4>可以節省空間

(1)#define 定義的常量在編譯期間替換,並分配內存,而且每次替換都要分配內存,相當於立即數

(2)const定義的常量聲明時並未放入ROM中,而是放入了符號表中,在第一次用的時候分配內存,以後就不再分配內存了,相當於取地址

4、extern

<1>extern用於函數定義,表示全局

<2>extern用於變量,表示在其他地方定義

5、Static

<1>static成員的內存空間不在類的實例中,而是像全局變量一樣在靜態存儲區,被所有類對象共享

<2>static數據成員的初始化放到類的外面

<3>static在函數內部,表示該變量的值在各個調用期間一直保持延續性。在函數這一級,表示函數對本文可見

   <4>static修飾的全局變量(或者函數):只能在本文件中使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章