2010-02-07 126 views
54

有人可以解釋一個staticconst變量之間的區別嗎?靜態和常量變量有什麼區別?

+53

@jagannath:是的,他可以,但如果他是一個非常熟練的程序員FORTRAN,由Fortran編程書堆裏,有一個C源代碼的壓力下進行調試和不知道在哪裏看?對於那些知道的人來說,stackoverflow也是很容易的問題,但對於那些不知道的人來說很難。 – 2010-02-07 07:51:00

+2

static和const只在C++中聲音相同。但這裏的靜態意味着它保持活躍,不會被垃圾回收,在這個意義上與動態相反。而const,就是那個常數。 – 2014-10-20 03:00:53

回答

34

恆定值不能改變。一個靜態變量存在於一個函數或類中,而不是一個實例或對象。

這兩個概念不是相互排斥的,可以一起使用。

+1

也有靜態全局變量,它們是在函數和類之外聲明的靜態變量。我相信唯一的目的是文件範圍界定。 – Swiss 2010-02-07 08:40:54

+1

@Swiss:是的,'static int fileScopeFoo = 42;'是'namespace {int fileScopeFoo = 42; }' – MSalters 2010-02-08 10:45:01

+1

據我所知,靜態全局變量在C中不被棄用,因爲沒有名稱空間。 – Swiss 2010-02-08 18:21:41

5

常量不能改變,靜態變量更多的是如何分配和訪問它們。

看看這個site

3

類的上下文中的靜態變量在類的所有實例之間共享。

在一個函數中,它仍然是一個持久變量,因此您可以計算一個函數被調用的次數。

當在函數或類外部使用時,它確保該變量只能被該特定文件中的代碼使用,並且無法在其他地方使用。

但是,常數變量不能改變。 const和static一起使用的常見用法是在類定義中提供某種常量。

class myClass { 
public: 
    static const int TOTAL_NUMBER = 5; 
    // some public stuff 
private: 
    // some stuff 
}; 
2

靜態意味着本地編譯單元(即,單一的C++源碼文件),或者換句話說,這意味着它不被添加到一個全局命名空間。您可以在不同的C++源代碼文件中使用多個靜態變量,其中的名稱與名稱相同,並且沒有名稱衝突。

const只是常量,意思是不能修改。

+0

在C++中,對於文件作用域變量,匿名命名空間優於靜態。 – 2010-02-07 08:07:41

+0

@JonathanLeffler爲什麼呢?爲了獲得未知命名空間塊的另一個級別的縮進並增加圈複雜度?或者爲了避免在所有靜態函數之前寫靜態?我認爲使用靜態而不是匿名命名空間與使用未命名的命名空間一樣可取,這是編程風格偏好的問題。 – BitTickler 2015-05-28 20:31:40

+0

@BitTickler:請參閱[棄用靜態關鍵字 - 不再?](http://stackoverflow.com/questions/4726570/deprecation-of-the-static-keyword-no-more)進行討論。 2010年我沒有意識到問答的內容 - 它是在2011年編寫的。 – 2015-05-28 20:50:07

1

靜態變量在一個類型的所有實例中是通用的。

常量變量是特定於每個單獨的類型實例的,但它們的值在編譯時是已知的和固定的,並且在運行時不能更改。

與常量不同,可以在運行時更改靜態變量值。

2

靜態變量只能獲得初始值一次。這意味着如果在示例函數中有諸如「static int a=0」之類的代碼,並且此代碼在此函數的第一次調用中執行,但在隨後的函數調用中不會執行;變量(a)仍將具有其當前值(例如,當前值爲5),因爲靜態變量僅獲得一次初始值。

常量變量的值在整個代碼中都是常量。例如,如果將常量變量設置爲「const int a=5」,則「a」的這個值在整個程序中將保持不變。

0

常量意味着恆定的,其值在運行時在編譯時定義,而不是明確在運行時也改變它,常量的值不能改變

但是靜態變量是可以被初始化和改變的變量運行。但是,靜態變量不同於靜態變量保留其整個程序的值的意義,即它們的壽命是程序的壽命,或者直到程序使用動態分配方法分配內存爲止。然而,即使他們保留其值在程序的整個生命週期無法訪問它們的代碼塊,他們都在

欲瞭解更多信息靜態變量引用here

18

簡短的回答之外:

const是一個承諾,您不會嘗試修改一次設置的值。

A static變量表示對象的生命週期是程序的整個執行過程,它的值在程序啓動前僅初始化一次。如果你沒有明確設置一個值,所有的靜態都被初始化。靜態初始化的方式和時間是未指定

C99借用了C++中const的使用。另一方面,static一直是許多辯論(兩種語言)的來源,因爲它經常混淆語義。

此外,使用C++ 0x直到C++ 11時,不建議使用static關鍵字來聲明名稱空間範圍內的對象。由於各種原因,C++ 11中刪除了此棄用(請參閱here)。

較長的答案:更多的關鍵字比你想知道(從一標準):

C99

#include <fenv.h> 
#pragma STDC FENV_ACCESS ON 

/* file scope, static storage, internal linkage */ 
static int i1; // tentative definition, internal linkage 
extern int i1; // tentative definition, internal linkage 

int i2; // external linkage, automatic duration (effectively lifetime of program) 

int *p = (int []){2, 4}; // unnamed array has static storage 

/* effect on string literals */ 
char *s = "/tmp/fileXXXXXX"; // static storage always, may not be modifiable 
char *p = (char []){"/tmp/fileXXXXXX"}; // static, modifiable 
const char *cp = (const char []){"/tmp/fileXXXXXX"} // static, non-modifiable 


void f(int m) 
{ 
    static int vla[ m ]; // err 

    float w[] = { 0.0/0.0 }; // raises an exception 

    /* block scope, static storage, no-linkage */ 
    static float x = 0.0/0.0; // does not raise an exception 
    /* ... */ 
    /* effect on string literals */ 
    char *s = "/tmp/fileXXXXXX"; // static storage always, may not be modifiable 
    char *p = (char []){"/tmp/fileXXXXXX"}; // automatic storage, modifiable 
    const char *cp = (const char []){"/tmp/fileXXXXXX"} // automatic storage, non-modifiable 

} 

inline void bar(void) 
{ 
    const static int x = 42; // ok 
    // Note: Since an inline definition is distinct from the 
    // corresponding external definition and from any other 
    // corresponding inline definitions in other translation 
    // units, all corresponding objects with static storage 
    // duration are also distinct in each of the definitions 
    static int y = -42; // error, inline function definition 
} 

// the last declaration also specifies that the argument 
// corresponding to a in any call to f must be a non-null 
// pointer to the first of at least three arrays of 5 doubles 
void f(double a[static 3][5]); 

static void g(void); // internal linkage 

C++

大多相同的語義除非在簡短的回答中指出。此外,沒有參數符合static s。

extern "C" { 
static void f4(); // the name of the function f4 has 
        // internal linkage (not C language 
        // linkage) and the function’s type 
        // has C language linkage. 
} 

class S { 
    mutable static int i; // err 
    mutable static int j; // err 
    static int k; // ok, all instances share the same member 
}; 

inline void bar(void) 
{ 
    const static int x = 42; // ok 
    static int y = -42; // ok 
} 

C++的static還有幾個細微差別,我在這裏省略。看看書或標準。

+0

我不明白爲什麼'static int y = -42;'會是一個錯誤。這樣做可能不太明智,但我認爲這是非常合法的。 (請參閱http://stackoverflow.com/questions/2217628/multiple-definition-of-inline-functions-when-linking-static-libs/2218034#2218034) – 2010-02-07 22:59:42

+3

@litb:因爲函數的內聯定義不允許在C99中有可修改的靜態對象定義。見6.7.4。第3段和下一頁的相關腳註(可能)。 – dirkgently 2010-02-07 23:14:11

+0

你知道這個限制的原因嗎?我的意思是,內聯定義已經被允許暴露不同的行爲。爲什麼它們僅限於不可修改的對象定義,並禁止使用帶有內部鏈接的標識符?我想這樣的靜態變量可以用於調試/等。任何想法? – 2010-02-07 23:27:54

0

常數變量不能改變。靜態變量對於文件是私有的,只能在程序代碼中訪問,而不能在其他人中訪問。

0

簡單和簡短的答案是內存分配給靜態和常量只有一次。但是在常量中,只有一個值在靜態值中可能會改變,但是在程序結束之前內存區域保持不變。

+1

對於'const',編譯器可以將原始值放入目標代碼中,就好像它是一個'#define'(帶着花裏胡哨的效果) – 2012-12-04 21:12:01

-3

靜態值可能存在一個函數中,可以以不同的形式使用,並且可以在程序中具有不同的值。 在程序遞減之後,它們的值在整個程序期間可能會改變,但是const會保持不變。

+0

更好試一下非常有用 – 2012-01-20 06:57:14

0

static關鍵字定義的變量範圍而const關鍵字定義不能在程序執行期間被改變

2

const相當於#define但只值語句(例如#define myvalue = 2)的變量的值。聲明的值在編譯之前會替換變量的名稱。

static是一個變量。該值可能會改變,但變量在整個程序執行過程中都會持續,即使該變量是在函數中聲明的。它相當於一個全局變量,它的使用範圍是它們已經聲明的塊的範圍,但它們的值是全局的。

因此,靜態變量只能初始化一次。如果變量在函數中聲明,這一點尤其重要,因爲它保證初始化只會在首次調用函數時發生。

靜態的另一個用法涉及對象。在對象中聲明一個靜態變量的效果是,該值對於該對象的所有實例都是相同的。因此,它不能用對象的名字來調用,而只能用類的名字來調用。

public class Test 
{ 
    public static int test; 
} 
Test myTestObject=new Test(); 
myTestObject.test=2;//ERROR 
Test.test=2;//Correct 

在像C和C++語言,是沒有意義的聲明靜態全局變量,但它們在函數和類是非常有用的。 在託管語言中,產生全局變量的唯一方法是將其聲明爲靜態。

4

靜態變量:

  • 只初始化一次。
  • 靜態變量用於類(不是每個對象)。即每個類僅分配一次內存,並且每個實例都使用它。所以如果一個對象修改了它的值,那麼修改後的值對其他對象也是可見的。 (一個簡單的想法。要知道一個類創建的對象的數量,我們可以把一個靜態變量,做++中的構造函數)的不同功能之間
  • 值一直呼籲

常變量:

  • Const變量是一個承諾,您不會在程序中的任何位置更改其值。如果你這樣做,它會抱怨。
相關問題