C++ 之 static

1.在C中static同時有兩種完全不同的含義:
a.表示存儲是持久存儲 persistent
b.訪問性是有侷限的 hidden

2.在函數內部定義的static變量,存儲在全局變量區,但在函數外無法使用,因爲函數外部的其他函數不知道此變量存儲的地方。但可以在此函數中返回static變量的指針,共其他函數使用。

3.在C中,全局變量或函數前面加static表示此變量或函數只能在此文件中使用。在局部變量前加static表示此變量存儲在全局數據區中。

4.在C++中:
static free functions 無效
static global variables 無效
static local variables 全局存儲
static member variables 對象之間共享
static member function 對象之間共享,只能訪問靜態變量或靜態函數

5.若函數中一個類的對象爲static,則其在鏈接時分配空間,在第一次進函數時初始化。若對象是靜態的,則C++保證只構造和析構一次。

6.全局的static對象,在鏈接時分配空間,在函數一運行,main函數運行之前構造,初始化。程序結束時析構。

7.多個文件之間的全局變量初始化無確定順序。

 

靜態成員:
1.靜態成員變量
對類的所有成員函數都是全局的,但是在這個類的所有不同對象之間是保持一致的。在源文件作用域內,只初始化一次
提供一個地方爲這些變量,並在 .cpp文件裏初始化它們,但是在 .cpp 文件裏面並沒有static

靜態本地變量實際上在全局存儲區裏面,你在某個類裏面有個靜態變量,它也在全局存儲區裏面,類裏面的變量是聲明,由鏈接器去找,類裏面的東西都是聲明,所以如果你類裏面聲明瞭一個靜態的成員變量,你要在某個源文件那裏寫上: int A::i; 可以有默認值,因爲相當於全局變量,相當於全局變量的定義。

 

靜態成員函數:

靜態成員函數,給我們提供了一個手段,在你建立任何對象之前啊,你就可以調用靜態成員數據或者函數。

成員函數之所以可以訪問成員變量,是因爲有隱含的 this 的前提。

靜態成員函數只能訪問靜態成員變量(因爲如果是直接使用A::i,這裏面沒有創建實例,導致沒有this指針,所以無法指向非靜態成員變量)

 

 

一、靜態成員的特點:

(1)static數據成員在類的內部聲明,但只能在類的外部定義,在類的外部不能指定static,在類的定義時候進行初始化;

(2)static數據成員只能在類的外部進行初始化(特例:當整型const static數據成員被常量表達式初始化時,就可以在類的內部進行初始化,但還需要在外部進行定義)。

(3) static數據成員可以是該成員所屬的類類型,而非static數據成員只能自身類的引用或者指針。

(4)static數據成員可以用作類成員函數的默認實參。

(5)static數據成員的值可以改變。

二、靜態成員和非靜態成員的區別:

(1) 靜態變量使用 static 修飾符進行聲明,在類被實例化時創建,通過類和對象都可以進行訪問;

(2)不帶有 static 修飾符聲明的變量稱做非靜態變量,在對象被實例化時創建,通過對象訪問;

(3) 一個類的所有實例的同一靜態變量都是同一個值,同一個類的不同實例的同一非靜態變量可以是不同的值。

(4) 靜態函數的實現裏不能使用非靜態成員,如非靜態變量、非靜態函數等。

三、靜態成員函數的特點:

(1) static 成員函數沒有 this 形參,它可以訪問所屬類的 static 成員,但不能訪問非 static 成員。

(2)static成員函數既可以在類的內部定義,也可以在類的外部定義,在外部定義時,不能重複指定static保留字。

(3)static成員函數不能聲明爲虛函數,不能實現動態綁定

(4)static 成員函數不能聲明爲const,因爲const是針對this是不是const而言的

(5)構造函數、析構函數不能爲靜態函數

 

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