例項構造器和類(引用型別)
構造器是將型別的例項初始化良好狀態的特殊方法。構造器方法在"方法定義元資料表"中始終叫做.ctor(constructor的簡稱);
建立引用型別的例項時,首先為例項的資料字段分分配呢村,然後初始化物件的附加字段(型別物件指標和同步塊索引),最後呼叫型別的實力構造器來設定物件的初始狀態。
例項構造器永遠不能被繼承。也就是說,類只有類自己定義的例項構造器。
類沒有顯式定義任何構造器,c#編譯器將定義為乙個預設的(無參)構造器。
如果類的修飾符為abstract,那麼編譯器生成的預設構造器的可訪問性就為proteced;
如基類沒有提供無參構造器,那麼派生類必須顯式呼叫乙個基類的構造器,否則編譯器會報錯。
如果類修飾符為staic(sealed和abstract),編譯器根本不會在類的定義生成預設構造器。(靜態類在元資料中是抽象密封類)
例項構造器和結果(值型別)
值型別(struct)構造器的工作方式與引用型別(class)的構造器截然不同。clr總是允許建立值型別的例項,並且沒有辦法阻止值型別的例項化。
注意:1.結構不能包含顯式的無引數建構函式
2.結構中不能有例項字段初始值設定項
3.在構造器控制返回到呼叫方之前,結構的字段必須完全賦值
4.結構靜態建構函式很多時候是不會執行的
型別構造器(type constructor):可以稱為靜態構造器(static constructor),類構造器(class constructor)或者型別初始化器(type initializer)
注意點:
1.靜態建構函式中不允許出現訪問修飾符,只能是公共的public
2.在il編譯器中,型別構造方法總是叫.cctor(代表 class constructor)
操作符過載注意點: 關鍵字operator
clr規範要求操作符過載方法必須是public和static方法。
如果乙個型別定義了操作符過載方法,microsoft還建議型別定義更友好的公共靜態方法,並在這種方法的內部呼叫操作符過載方法。
public sealed class complex}
轉換操作符方法: 是將乙個物件從一種型別轉換成另一種型別的方法。
在inplicit或explicit關鍵字之後,要指定operator關鍵字告訴編譯器改方法是乙個轉換操作符。在operator之後,指定物件要轉換成什麼型別。在圓括號內,指定要從什麼型別轉換。
擴充套件方法規則和原則:
1.c#只支援擴充套件方法,不支援擴充套件屬性,擴充套件事件,擴充套件操作符等
2.擴充套件方法(第乙個引數前面有乙個this的方法)必須在非泛型的靜態類中宣告。
3.c#編譯器在靜態類中查詢擴充套件方法時,要求靜態類本身必須具有檔案作用域;擴充套件方法必須在頂級靜態類中定義。
4.由於靜態類可以取任何名字,所以c編譯器要花一定時間來尋找擴充套件方法,它必須檢查檔案作用域中的所有靜態類,並掃瞄它們靜態方法來查詢乙個匹配。
6.使用這個功能必須謹慎,乙個原因是並非所有程式設計師都熟悉它
7.擴張方法可能存在版本控制問題。例如micosoft未來為他們stringbuilder類新增了indexof例項方法,而且和我的**調式一樣,那麼在重新編譯我的**時,編譯器會繫結到micosoft的indexof例項方法,而不是我的靜態方法indexof方法。
第八章 指標 第八章 指標
1 什麼是位址 include using namespace std int main 11 在堆中建立對像 我們既然可以在堆中儲存變數,那麼也就可以儲存對像,我們可以將對像儲存堆中,然後通過指標來訪問它 include using namespace std class human 14 在建構...
第八章學習小結
內容 這章我具體學習了 穩定的 1.直接插入法 最簡單且穩定。2.折半插入法 利用 折半查詢 3.氣泡排序 最簡單的交換排序,可用於順序表和鏈式儲存結構,但只能交換相鄰記錄,適於小規模資料。4.簡單選擇排序 即 直接選擇排序 與冒泡演算法上有些類似,但也不適於大規模資料 o n 2 2 5.歸併排序...
第八章學習小結
思維導圖 練習總結 排序的穩定性是指 保證排序前兩個相等的數在序列中的前後順序,和排序後相同。要從 50 個鍵值中找出最大的 3 個值,選擇排序比堆排序快。t 規模較小直接選擇排序快 設有5000個無序的元素,希望用最快的速度排出其中前50個最大的元素,最好選堆排序 堆排序不需要等整個排序結束就可挑...