2014-03-26 65 views
2

我正在研究靜態和常量關鍵字。程序員何時使用'static'和'const'關鍵字?

靜態:使用靜態修飾符來聲明靜態成員,該靜態成員屬於類型本身,而不是屬於特定對象。

const:你使用const關鍵字來聲明一個常量字段或一個常量本地。該關鍵字指定該字段或局部變量的值是常量,這意味着它不能被修改。

我想知道關於程序員使用靜態和常量關鍵字的例子。

+0

我想這個問題會更適合在[programmers.stackexchange.com](http://programmers.stackexchange.com/) – ponciste

回答

3

const的變量或常量,將用於聲明不會改變的值或者你想從防止正在改變。例如,Pi可以在C++中聲明爲常量。

const double kPi = 3.14159265359; 

靜態變量有點不同。在類\函數中只存在一個靜態變量實例。

例如:

void foo() 
{ 
    static int bar = 0; 
    printf("%d\n", bar); 
    ++bar; 
} 

int main() 
{ 
    int i; 
    for(i = 0; i < 5; ++i) 
    { 
     foo(); 
    } 
} 

將打印:

0 
1 
2 
3 
4 

即使欄超出範圍,它的價值仍然在內存中,所以它只能初始化一次。每次調用foo()時,該值都會遞增。

編輯:

爲了澄清,編譯器將實際上是它產生彙編代碼內的靜態變量保留存儲器。此外,static關鍵字還會告訴編譯器只精確地初始化變量一次。變量的範圍是相同的(在foo函數內部),但是在上述情況下它僅被初始化一次。當函數被調用時,自動變量(例如int i)被壓入調用堆棧。

+0

如果你嘗試覆蓋const變量>? – variable

+0

GCC抱怨拋出錯誤,因爲你基本上說你的const實際上不是一個const。 – csnate

+0

但每次你分配int bar = 0;所以爲什麼它沒有得到解決? – EverythingEthical

0

如果你想讓任何變量/方法可用,而不考慮靜態成員的對象,但是如果你希望同樣的變量不可修改,那麼const就是解決方案。下面的例子可以幫助你理解這一點。

在下面示例

  • PI定義爲恆定,並且不能/不應改變
  • ONLINE保持用戶數量的在線,它可以改變但是應該可用不論對象

    public class Example 
    
    { 
    
        //PI should not be changed, with reasons known that it is a constant 
        public const double PI = 3.14; 
    
        //Users currently using the application 
        public static int ONLINE = 0; 
    
        public Example(){ ONLINE++; } 
        public void dispose(){ ONLINE--; } 
    
        public static int loggedInUsers(){ return ONLINE; } 
        public void GetArea(int radius){return PI*radius*radius; } 
    } 
    
2

(所有這一切都爲Langage C++)

嗨,你可以使用常量和靜態關鍵字在少數情況下,對於爲例:

常量

首先,用來說變量不能被修改。

int main() 
{ 
const int toto[4] = {0, 1, 2, 3};  
return (0); 
} 

//我們不能在聲明後修改toto,爲什麼它有用?它保持你的程序設計的狀態

第二個,用來說一個方法不會修改對象狀態。

class toto 
{ 
    int i; 

    public: 

    int geti() const; 

} 

// CPP中的所有吸氣劑都使用它。爲什麼它有用?使用該類的開發人員知道他不修改對象狀態

第三個,用於說明傳遞給函數的參數不被函數修改。

int function(const std::string &str) 
{ 
// function cannot modify the object string pass in parameter 
} 

靜態

首先,過去常說,一個實現的功能是隻知道內一個單一的文件。

static int fct() 
{ 
    return (0); 
} 

//可以調用ONY功能FCT()如果你是誰內就實現

文件,過去常說,一個參數或方法是共同的所有對象同班。

class toto 
{ 
    public : 

static int getLol(); 
}; 

//每個對象totoObj1,totoObj2 ...將調用相同的功能

第三和最後一個,過去常說,一個變量不相同功能的多個呼叫之間改變狀態的地方聲明

void fct() 
{ 
    static i = 0; 

    std::cout << ++i << std::endl; 
} 

//這個函數會打印1然後2然後3 ...

如果您有任何疑問,歡迎您:)