2010-02-10 201 views
5

我對C++中的static關鍵字有一些疑問(可能還有其他語言)。將函數聲明爲靜態的目的是什麼?關於帶關鍵字的靜態關鍵字的問題

void static foo(int aNumber) { 
... }

靜態內聯函數怎麼樣?

void static inline foo(int aNumber) { 
... }

對函數使用static關鍵字有什麼好處,並且這些好處是否也適用於類函數? 我知道一些數據類型,如使用舊的編譯器編譯時,結構和數組必須是靜態的,但是在使用新的ANSI-C++編譯器(如MS VC++ 2008)時有什麼意義?我知道在一個循環中使用一個靜態變量可以節省時間,將數據保存在內存中,而不是在每次循環迭代時重新分配內存,但是如何聲明變量只被聲明一次,如在頭文件的頂部或命名空間中?

+0

您是否具體詢問在類/結構之外聲明的函數? – Bill 2010-02-10 14:53:00

+0

我一般都在問,謝謝你的評論,但是Brian已經回答了我的問題。 – Dooms101 2010-02-10 15:27:53

回答

15

取決於上下文:

像C++很多事情,static意味着不同的事情取決於它的上下文。

對於同一個詞來說,在C++中非常常見,這取決於上下文的含義。
例如:

  • *用於乘法,解除引用一個指針,和創建指針。
  • &用於獲取變量的地址,聲明參考以及作爲按位AND運算符。

全球使用靜態:

如果聲明函數和變量作爲一個類的靜態之外,在全球範圍內,它是特定於只文件。如果您嘗試在其他文件中使用該變量或函數(通過前向聲明),將會出現鏈接錯誤。

例子:

a.cpp:

static void fn() 
{ 
    cout<<"hello a!"<<endl; 
} 

b.cpp:

void fn(); 
void gn() 
{ 
    fn();//causes linking error 
} 

此功能允許您使用,沒有其他的文件永遠不會看到一個功能,這樣你不引起可能的多次定義符號的鏈接器錯誤。要做到這一點的最佳方法是採用匿名的命名空間,但:

a.cpp:

namespace 
{ 
    void fn() // will be static to a.cpp 
    { 
    cout<<"hello a!"<<endl; 
    } 
} 

類內部用靜態的:

如果聲明函數或變量爲靜態的內部類(或結構體),它是一個類函數或類變量。這意味着整個班級只有一個。一個類函數只能使用類變量。類變量在該類的所有實例中共享。

class C 
{ 
public: 
    static void fn() 
    { 
    y = 4;//<--- compiling error 
    // can't access member variable within a static function. 
    } 

    int y; 
} 

這是一個偉大的功能,如果你有一些是具體到你的類的對象,而不是具體的一個實例使用。

內部功能使用的靜態:

如果你聲明一個函數內部的變量作爲靜態的,你可以考慮的變量值將在通話持續。它只會被初始化一次。

例子:

//Will print 0, then 1, then 2, ... 
void persistentPrintX() 
{ 
    static int x = 0; 
    cout << x << endl; 
    x++; 
} 

我個人儘量避免這種情況,你可能應。擁有全球化的國家並不好。具有相同輸入保證相同輸出的函數會更好。

就像在英語:

的上下文相關的含義的概念並不具體到C++,你甚至可以看到它在英語語言。

  • 我要screen電影(意味着顯示出電影)
  • 電視上的screen壞了(指電視機的一部分)在其他編程語言

其他的含義:

根據編程語言的不同,可能會有不同的含義,但大多數人認爲當你說static是第一類vari能夠/函數vs成員變量/函數。

+0

最令人困惑的使用靜態。他們不能只用'私人'。 – Yacoby 2010-02-10 14:56:53

+0

他們可以但他們會有一個超載的字:私人意義不同的東西:) – 2010-02-10 14:59:21

+1

重複使用關鍵字聽起來確實很愚蠢。這就像使用'auto'來處理不同的事情。哦,等等... – 2010-02-10 15:05:09

3

我在irc.freenode.net上的## C++ irc​​頻道上閒逛,我非常喜歡bot nolyc編程給出的關於static的說明。我引用逐字逐句:

當一個函數內部中使用的, static關鍵字指示 變量共享之間的所有調用函數的 。在 類中使用時,表示變量 或函數是成員,但不是 與特定實例綁定。當在名稱空間內使用 時,它指定 內部鏈接。

我希望能夠解決問題。我沒有回答你所有的問題。我想說,你應該使用static關鍵字來完成它打算做的事情。如果它是正確的工作,那麼將它用作工具來完成你的任務。就福利而言,我不會擔心。如果您需要優化,那麼如果沒有其他度假村,請考慮這些影響。

我希望這會有所幫助。