說說C C 中的static

2021-07-16 08:17:20 字數 2720 閱讀 9881

—————————————————————————————————————————————

c語言中的靜態

—————————————————————————————————————————————

1).區域性

a.靜態區域性變數在函式內定義,生存期為整個源程式,但作用域與自動變數相同,只能在定義該變數的函式內使用。退出該函式後, 儘管該變數還繼續存在,但不能使用它。

b.對基本型別的靜態區域性變數若在說明時未賦以初值,則系統自動賦予0值。而對自動變數不賦初值,則其值是不定的。

2).全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。但是他們的作用域不同,非靜態全域性 變數的作用域是整個源程式(多個原始檔可以共同使用); 而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔內有效, 在同一源程式的其它原始檔中不能使用它。

靜態函式
在函式的返回型別前加上關鍵字static,函式就被定義成為靜態函式。

函式的定義和宣告預設情況下是extern的,但靜態函式只是宣告在它的檔案當中可見,不能被其他檔案所用。

定義靜態函式的好處:
<1> 其他檔案中可以定義相同名字的函式,不會發生衝突。

<2> 靜態函式不能被其他檔案所用。儲存說明符auto,register,extern,static,對應兩種儲存期:自動儲存期和靜態儲存期。 auto和register對應自動儲存期。具有自動儲存期的變數在進入宣告該變數的程式塊時被建立,它在該程式塊活動時存在,退出該程式塊時撤銷; 關鍵字extern和static用來說明具有靜態儲存期的變數和函式。用static宣告的區域性變數具有靜態儲存持續期(static storage duration),或靜態範圍(static extent)。雖然它的值在函式呼叫之間保持有效,但是其名字的可視性仍限制在其區域性域內。靜態區域性物件在程式執行到該物件的宣告處時被首次初始化。

1. 統計次數功能

宣告函式的乙個區域性變數,並設為static型別,作為乙個計數器,這樣函式每次被呼叫的時候就可以進行計數。這是統計函式被呼叫次數的最好的辦法,因為這個變數是和函式息息相關的,而函式可能在多個不同的地方被呼叫,所以從呼叫者的角度來統計比較困難。

c語言中使用靜態函式的好處:

靜態函式會被自動分配在乙個一直使用的儲存區,直到退出應用程式例項,避免了呼叫函式時壓棧出棧,速度快很多。

關鍵字「static」,譯成中文就是「靜態的」,所以內部函式又稱靜態函式。但此處「static」的含義不是指儲存方式,而是指對函式的作用域僅侷限於本檔案。 使用內部函式的好處是:不同的人編寫不同的函式時,不用擔心自己定義的函式,是否會與其它檔案中的函式同名,因為同名也沒有關係。

—————————————————————————————————————————————

c++中的靜態

—————————————————————————————————————————————

假設person類中定義了乙個static資料成員age,注意在類中不能對static資料成員進行初始化,要初始化的話必須在類外進行定義!在類外定義int person::age=20;這裡前面就不要再加static了。

注意static資料成員不是通過類建構函式進行初始化的!

子類繼承父類時,子類中const常量,必須在初始化列表中初始,不能使用賦值的方式初始化。

例:class dog: public animal

private:

int m_type;

const int legs;

};如果類中有多個static資料成員,static資料成員初始化的次序是按照static資料成員在類中的宣告次序進行初始化的,初始化了之後,就可以使用static資料成員了。

我們可以通過作用域操作符從類直接呼叫static資料成員,或者通過物件,引用,或指向該類型別物件的指標間接呼叫(這種情況下static資料成員必須是public的訪問許可權,如果定義在private訪問許可權下是不行的)。

說到static資料成員,有一種情況不得不提,那就是特殊的const static成員。如上面所述,類的static成員,像普通資料成員一樣,不能在類的定義體中進行初始化,只能在類外進行初始化。const int 型的static成員便可以在類定義體內部進行初始化。記住一定只能是static const int型的,換成const string ,double都不行的。

說完了static成員後,我們再來看看static成員函式,static成員是類的組成部分並不是任何物件的組成部分,因此,static成員函式沒有this指標。我們知道,一般而言,類中的成員函式具有乙個附加的隱含實參,即指向該類物件的乙個指標。這個隱含實參命名為this。因為static成員函式不是任何物件的組成部分,所以static成員函式就沒有this形參了。

由於成員函式宣告為const說明該成員函式不會修改該成員函式所屬的物件,所以static成員函式不能宣告為const。為什麼呢?因為static成員函式不是任何物件的組成部分。static成員函式可以直接訪問所屬類的static成員,但是不能直接使用非static成員函式!也不能訪問static const 型別的成員!

靜態成員函式和靜態資料成員一樣,它們都屬於類的靜態成員,它們都不是物件成員。因此,對靜態成員的引用不需要用物件名。

在靜態成員函式的實現中不能直接引用類中說明的非靜態成員,可以引用類中說明的靜態成員。如果靜態成員函式中要引用非靜態成員時,可通過物件來引用。

C C 中static的用法

c c 的static有兩種用法 面向過程程式設計中的static和物件導向程式設計中的static。前者應用於普通變數和函式,不涉及類 後者主要說明static在類中的作用。一 面向過程設計中的static 1 靜態全域性變數 在全域性變數前,加上關鍵字static,該變數就被定義成為乙個靜態全域...

C C 中static的使用

最近在看 c 總是不斷的遇到關鍵字static,對此關鍵字不是很了解,每次遇到都有些困惑,不知道此處為啥要用static,今日通過網上一些資料,仔細認真的了解了 static 的用法。static的在好多程式語言中存在,那他在 c 中出現的原因是什麼呢?換句話說就是在 c 中什麼時候需要使用到 st...

C C 中static的作用

此文引用自 static有什麼作用?答 在c語言中,static主要定義全域性靜態變數,定義區域性靜態變數,定義靜態函式 一 定義全域性靜態變數 在全域性變數前面加上關鍵字static,該全域性變數變成了全域性靜態變數。全域性靜態變數有以下特點 1 在全域性資料區內分配記憶體 2 如果沒有初始化,其...