【總結】C++與C#中的static靜態修飾符
阿新 • • 發佈:2018-04-10
this sea const 數據 一切都 UC 限制 有一個 字段 重點
C#中的const是隱式static的,可以由類名直接訪問。C++const更接近於只讀,所以兩者的const是不同的
C#
靜態類
- 靜態類(sealed+abstract)
- 靜態構造函數(無參,無限制符,自動執行一次)
- 靜態變量(類級別,實例無關,靜態存儲區中)
- 靜態方法(不能被重寫)
- 靜態局部變量(始終存在)
- 靜態成員 的內存只被分配一次,會一直存在於程序的整個生命周期中。
- 如果要將靜態成員在類內初始化,那麽該變量需要聲明為const常量。
- int class :: c = 10; static數據成員可以在類外定義和初始化,也可以在函數中賦值。可以直接由 class::member 訪問,但是不能用 .訪問
- 成員函數、靜態成員函數、虛函數
在c++中類的成員函數都是保存在靜態存儲區中的,都是通過函數地址來訪問。 - 不能調用non-static函數,但是可以通過引用傳遞間接調用
- 為什麽靜態成員函數不能是const?const修飾符用於表示函數不能修改成員變量的值,該函數必須是含有this指針的類成員函數,函數調用方式為thiscall
- 靜態類的本質,是一個抽象的密封類,所以不能被繼承,也不能被實例化。
- 靜態類與非靜態類的重要區別在於靜態類不能實例化,也就是說,不能使用 new 關鍵字創建靜態類類型的變量。也不能有非靜態成員(即實例成員)
- 不支持繼承,所以靜態類不能包含protected成員。但是可以實現接口。interface不能是靜態的
- 靜態類通常是收集一些常用的方法,與面向對象無關了
- 這個類的成員,第一次被訪問之前,會執行靜態構造函數。如類被實例化或者靜態成員被調用的時候進行調用,並且是由.net框架來調用靜態構造函數來初始化靜態成員變量。
- 靜態構造函數只被執行一次。
- 靜態構造函數不可被訪問限制符修飾, 因為靜態構造函數不是我們程序員調用的,是由.net 框架在合適的時機調用的。
- 靜態構造函數沒有參數,因為框架不可能知道我們需要在函數中添加什麽參數,所以規定不能使用參數。
- 一個類中只能有一個靜態構造函數。
- 無參數的靜態構造函數和無參數的構造函數是可以並存的。因為他們一個屬於類級別,一個屬於實例級別,並不沖突。
- 如果我們在類中定義了靜態變量,但是又沒有定義靜態構造函數,那麽框架也會自動生成一個靜態構造函數以初始化類。
- 初始化器:即聲明字段後直接用=賦值
- 系統默認的初始化會將會在所有代碼執行前把一切都設置成0或者null,所以這時無需用初始化器
- 靜態構造函數在標準構造函數之前運行
- 非靜態類可以包含靜態的方法、字段、屬性或事件;
- 無論對一個類創建多少個實例,它的靜態成員都只有一個副本;
- 靜態方法和屬性不能訪問其包含類型中的非靜態字段和事件,並且不能訪問任何對象的實例變量;
- 可以在靜態方法中定義變量並使用,和普通方法一樣
- 靜態方法只能被重載,而不能被重寫,因為靜態方法不屬於類的實例成員
- 常量本質是靜態的:雖然字段不能聲明為 static const,但 const 字段的行為在本質上是靜態的。這樣的字段屬於類,不屬於類的實例。因此,可以同對待靜態字段一樣使用 ClassName.MemberName 表示法來訪問 const 字段;
- 可以用 static readonly(只讀不同於常量)
- this/base 關鍵字在靜態方法中不能使用,因為有可能對象還不存在。
- 類加載的時候,所有的靜態成員就會被創建在“靜態存儲區”裏面,一旦創建直到程序退出,才會被回收。
【總結】C++與C#中的static靜態修飾符