天天看點

關鍵字const static 以及extern(export)

1)在函數體内,一個被聲明為靜态的變量在這一函數被調用過程中維持其值不變(該變量存放在靜态變量區)。
       
設定變量的存儲域,函數體内static變量的作用範圍為該函數體,不同于auto變量,該變量的記憶體隻被配置設定一次,是以其值在下次調用時仍維持上次的值      
#include <iostream>

using namespace std;
void print();
int main()
{
    print();
    print();
    print();
    return 0;
}
void print()
{
    static int a=11;
    cout<<a<<endl;
    a++;
}

           
運作結果為:11 12 13 從結果上,可以看出static int a=11隻在第一次執行了一次,之後的改變都會對後面的再次調用産生影響.
2)     限制變量的作用域
在目前子產品内(但在函數體外),一個被聲明為靜态的變量可以被子產品内所用函數通路,但不能被子產品外其它函數通路。它是一個本地的全局變量。       
3)    限制函數的作用域
在子產品内,一個被聲明為靜态的函數隻可被這一子產品内的其它函數調用。那就是,這個函數被限制在聲明它的子產品的本地範圍内使用。
在嵌入式系統中,要時刻懂得移植的重要性,程式可能是很多程式員共同協作同時完成,在定義變量及函數的過程,可能會重名,這給系統的內建帶來麻煩,是以保證不沖突的辦法是顯示的表示此變量或者函數是本地的,static即可。
           
在Linux的子產品程式設計中,這一條很明顯,所有的函數和全局變量都要用static關鍵字聲明,将其作用域限制在本子產品内部,與其他子產品共享的函數或者變量要EXPORT到核心中。      
4)           在類中的static成員變量意味着它為該類的所有執行個體所共享,也就是說當某個類的執行個體修改了該靜态成員變量,其修改值為該類的其它所有執行個體所見;      
5) 在類中的static成員函數屬于整個類所擁有,這個函數不接收this指針,因而隻能通路類的static成員變量。
const意味着"隻讀",不是常數,可以是變量,隻是你不能修改它       
下面的聲明都是什麼意思?
      
本質:const在誰後面誰就不可修改,const在最前面則将其後移一位即可,二者等效      
前兩個的作用是一樣,a是一個常整型數。第三個意味着a是一個指向常整型數的指針
(也就是,指向的整型數是不可修改的,但指針可以,此最常見于函數的參數,當你隻引用傳進來指針所指向的值時應該加上const修飾符,程式中修改編譯就不通過,可以減少程式的bug)。      
第四個意思a是一個指向整型數的常指針(也就是說,指針指向的整型數是可以修改的,但指針是不可修改的)。
最後一個意味着a是一個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)
      
即使不用關鍵字,也還是能很容易寫出功能正确的程式,那麼我為什麼還要如此看重關鍵字const呢?我也如下的幾下理由:
      
1)關鍵字const的作用是為給讀你代碼的人傳達非常有用的資訊,實際上,聲明一個參數為常量是為了告訴了使用者這個參數的應用目的。如果你曾花很多時間清理其它人留下的垃圾,你就會很快學會感謝這點多餘的資訊。(當然,懂得用const的程式員很少會留下的垃圾讓别人來清理的。)      
2)通過給優化器一些附加的資訊,使用關鍵字const也許能産生更緊湊的代碼。      
3)合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現。      
const關鍵字至少有下列n個作用:
      
operator*的傳回結果必須是一個const對象。如果不是,這樣的變态代碼也不會編譯出錯:      
classA a, b, c;      
(a* b) = c; // 對a*b的結果指派  
操作(a* b) = c顯然不符合程式設計者的初衷,也沒有任何意義。      
extern (export)用法 為了通路其他編譯單元(如另一代碼檔案)中的變量或對象,對普通類型(包括基本資料類、結構和類),可以利用關鍵字extern,來使用這些變量或對象時;但是對模闆類型,則必須在定義這些模闆類對象和模闆函數時,使用标準C++新增加的關鍵字export(導出/出口/輸出)。例如: extern int n; extern struct Point p; extern class A a; export template<class T> class Stack<int> s; export template<class T> void f (T& t) {……} 一般是在頭檔案中給出類的定義或全局函數的聲明資訊,而在代碼檔案中給出具體的(類成員函數或全局函數的)函數定義。然後在多個使用者代碼檔案中包含該頭檔案後,就可以使用其中定義或聲明的類和函數。頭檔案中一般不包含變量、結構和類對象的定義,因為這樣可能會導緻重複定義的編譯錯誤。解決辦法是,在某個代碼檔案中進行定義,在其他使用者代碼檔案中用extern來引用它們。 但是對模闆類型,則可以在頭檔案中,聲明模闆類和模闆函數;在代碼檔案中,使用關鍵字export來定義具體的模闆類對象和模闆函數;然後在其他使用者代碼檔案中,包含聲明頭檔案後,就可以使用該這些對象和函數了。例如: // out.h:(聲明頭檔案——隻包含out函數的聲明資訊) template<class T> void out (const T& t); // out.cpp:(定義代碼檔案——包含out函數的聲明[通過include]和定義等全部資訊) #include <iostream> #include “out.h” export template<class T> void out (const T& t) {std::cerr << t;} //user.cpp:(使用者代碼檔案——包含函數的聲明頭檔案後就可以使用該函數) #include “out.h” // 使用out()

繼續閱讀