1、運算子過載:運算子重重載的關鍵是在物件上不能總是只呼叫方法或屬性,有時還需要做一些其他工作,例如,對數值進行相加、相乘或邏輯操作等。例如,語句if(a==b)。對於類,這個語句在預設狀態下會比較引用 a 和 b 。檢測這兩個引用是否指向記憶體中的同乙個位址,而不是檢測兩個例項是否包含相同的資料。然而對於 string 類,這種操作就會重寫,於是比較字串實際上就是比較每個字串的內容。可以對自己的類進行這樣的操作。 對於結構,「==」 運算子在預設狀態下是不做任何工作。試圖比較兩個結構,看看它們是否相等,就會產生乙個編譯錯誤。除非顯示地過載了「==」,告訴編譯器如何進行比較。
運算子的工作方式
完整**如下:
比較運算子的過載
c#中共有6個比較運算子 它們分為3對
c#要求成對過載比較運算子,即,如果過載了「==」,也就必須過載「!=」;否則會產生編譯錯誤。另外,比較運算子必須返回布林型別的值。這是它們與算術運算子的根本區別,
在過載 「==」 和「!=」 時,還必須過載從 system.object 中繼承的 equals() 和gethashcode() 方法,否則會產生乙個編譯警告。原因是equals()方法應實現與「==」運算子相同型別的相等邏輯。
除了這些區別外,過載比較運算子所遵循的規則與過載算術運算子相同。但比較兩個數並不像想象的那麼簡單,例如,如果只比較兩個物件引用,就是比較儲存物件的記憶體位址。比較運算子很少進行這樣的比較,所以必須編寫**過載運算子,比較物件的值,並返回相應的布林結果。
可以過載的運算子:
類別運算子
限制 算術二元運算子
+ 、*、 /、 -、 %
無 算術一元運算子
+、 -、 ++、 --
無按位二元運算子
&、|、^、<<、>>
無按位一元運算子
!、~、true、false
true 和 false 必須成對過載
比較運算子
==、!=、>=、<=、<、>
必須成對過載
賦值運算子
+= 、-=、 *=、 /=、 >>=、 <<=、 %=、 |=、 ^=
不能顯式地過載這些運算子,在重寫單個運算子(如+,-,%等)時,它們會被隱式地重寫。
索引運算子
不能直接過載索引運算子。索引器成員型別允許在類和結構上支援索引運算子
資料型別強制轉換運算子
()不能直接過載型別強制轉換運算子。使用者定義的型別強制轉換允許定義定製的型別強制轉換行為
2、使用者定義的型別強制轉換
定義型別強制轉換的語法類似於過載運算子,型別強制轉換在某種情況下可以看做是一種運算子默,其作用是從源型別轉換為目標型別。
publicstatic
implicit
operator
float
(currency value)//implicit 隱式 explicit 顯式
運算子的返回型別定義了型別強制轉換操作的目標型別,它有乙個引數,即要轉換的源物件。這裡定義的型別強制轉換可以隱式地把currency 型的值轉換為float 型。 注意,如果資料型別轉換宣告為隱式,編譯器就可以隱式或顯式地使用這個轉換。如果資料型別轉換宣告為顯式,編譯器就只能顯式地使用它。與其他運算子過載一樣,型別強制轉換必須同時宣告為public 和static。
3、裝箱和拆箱資料型別強制轉換
C 筆記2023年10月19日
楊輝三角 using system using system.collections.generic using system.linq using system.text namespace sj101901 列印數字 for int j 0 j i j else 需要計算空格的個數,防止大面積重...
2023年10月總結
一 工作 乙個月的時間裡,西寧佔90 昆明10 本月情況 西寧 整個月的重心都在西寧上,乙個星期改一次研發計畫,並且經常不按時間節點發版,測試沒辦法按照計畫來執行,真的是好累 覺得自己應該多去協助研發,但是估計是自己能力有限,所以基本只能丟擲問題,只能在需求有疑問的時候給出解決方案,然後就是測試出問...
2019 年10月10日C程式設計 1 3章
第一章 c語言主要特點 資料型別豐富 包括 整型,浮點型 字元型,陣列型別,指標型別,結構體型別,共用體型別 擴充 複數浮點型別,超長整型,布林型別 結構化控制語句 if else 語句 while語句 do while語句,switch語句,for語句 c語言允許用兩種注釋方式 單行注釋 塊式注釋...