關鍵字static的作用

這個簡單的問題很少有人能回答完全。在C語言中,關鍵字static三個明顯的作用:

1)在函數體內,一個被聲明爲靜態的變量在這一函數被調用過程中維持其值不變(該變量存放在靜態變量區)。

2) 模塊內(但在函數體外),一個被聲明爲靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量

3) 在模塊內,一個被聲明爲靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地範圍內使用。

大多數應試者能正確回答第一部分,一部分能正確回答第二部分,但是很少的人能懂得第三部分。這是一個應試者的嚴重的缺點,因爲他顯然不懂得本地化數據和代碼範圍的好處和重要性。

 

考點:在嵌入式系統中,要時刻懂得移植的重要性,程序可能是很多程序員共同協作同時完成,在定義變量及函數的過程,可能會重名,這給系統的集成帶來麻煩,因此保證不衝突的辦法是顯示的表示此變量或者函數是本地的,static即可。

Linux的模塊編程中,這一條很明顯,所有的函數和全局變量都要用static關鍵字聲明,將其作用域限制在本模塊內部,與其他模塊共享的函數或者變量要EXPORT到內核中。

 

static關鍵字至少有下列n個作用:
1)設置變量的存儲域,函數體內static變量的作用範圍爲該函數體,不同於auto變量,該變量的內存只被分配一次,因此其值在下次調用時仍維持上次的值;

2)限制變量的作用域,在模塊內的static全局變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問;

3)限制函數的作用域,在模塊內的static函數只可被這一模塊內的其它函數調用,這個函數的使用範圍被限制在聲明它的模塊內;
4在類中的static成員變量意味着它爲該類的所有實例所共享,也就是說當某個類的實例修改了該靜態成員變量,其修改值爲該類的其它所有實例所見;
5)在類中的static成員函數屬於整個類所擁有,這個函數不接收this指針,因而只能訪問類的static成員變量。


關鍵字const有什麼含意?

我只要一聽到被面試者說:"const意味着常數"不是常數,可以是變量,只是你不能修改它),我就知道我正在和一個業餘者打交道。去年Dan Saks已經在他的文章裏完全概括了const的所有用法,因此ESP(譯者:Embedded Systems  Programming)的每一位讀者應該非常熟悉const能做什麼和不能做什麼.如果你從沒有讀到那篇文章,只要能說出const意味着"只讀"就可以了。儘管這個答案不是完全的答案,但我接受它作爲一個正確的答案。(如果你想知道更詳細的答案,仔細讀一下Saks的文章吧。)

如果應試者能正確回答這個問題,我將問他一個附加的問題:下面的聲明都是什麼意思?

Const只是一個修飾符,不管怎麼樣a仍然是一個int型的變量

const int a;

int const a;

const int *a;

int * const a;

int const * a const;

本質:const在誰後面誰就不可修改,const在最前面則將其後移一位即可,二者等效

 

前兩個的作用是一樣,a是一個常整型數。第三個意味着a是一個指向常整型數的指針(也就是,指向的整型數是不可修改的,但指針可以,此最常見於函數的參數,當你只引用傳進來指針所指向的值時應該加上const修飾符,程序中修改編譯就不通過,可以減少程序的bug)。

 

第四個意思a是一個指向整型數的常指針(也就是說,指針指向的整型數是可以修改的,但指針是不可修改的)。最後一個意味着a是一個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)。

 

如果應試者能正確回答這些問題,那麼他就給我留下了一個好印象。順帶提一句,也許你可能會問,即使不用關鍵字 ,也還是能很容易寫出功能正確的程序,那麼我爲什麼還要如此看重關鍵字const呢?我也如下的幾下理由:

1) 關鍵字const的作用是爲給讀你代碼的人傳達非常有用的信息,實際上,聲明一個參數爲常量是爲了告訴了用戶這個參數的應用目的。如果你曾花很多時間清理其它人留下的垃圾,你就會很快學會感謝這點多餘的信息。(當然,懂得用const的程序員很少會留下的垃圾讓別人來清理的。)

2) 通過給優化器一些附加的信息,使用關鍵字const也許能產生更緊湊的代碼

3) 合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現。

 

const關鍵字至少有下列n個作用:

1)欲阻止一個變量被改變,可以使用const關鍵字。在定義該const變量時,通常需要對它進行初始化,因爲以後就沒有機會再去改變它了
2)對指針來說,可以指定指針本身爲const,也可以指定指針所指的數據爲const,或二者同時指定爲const
3)在一個函數聲明中,const可以修飾形參,表明它是一個輸入參數,在函數內部不能改變其值;
4)對於類的成員函數,若指定其爲const類型,則表明其是一個常函數,不能修改類的成員變量;
5)對於類的成員函數,有時候必須指定其返回值爲const類型,以使得其返回值不爲左值。例如:
const classA operator*(const classA& a1,const classA& a2); 
  operator*的返回結果必須是一個const對象。如果不是,這樣的變態代碼也不會編譯出錯:
classA a, b, c;
(a * b) = c; // 
a*b的結果賦值 

  操作(a * b) = c顯然不符合編程者的初衷,也沒有任何意義。

這是摘自網上他人的博客

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