天天看點

重載操作符文法

重載操作符

要求重載方法的參數至少有一個參數與重載方法的類型一樣。

運算符參數不能使用ref/out修飾符。

需許要注意的要點如下:

&&和||不能被直接重載,但使用&和|進入計算則可以被重載

[ ]不能被重載,可以使用索引器來代替它完成所需操作

( )不能被重載,代替此運算符的方式是定義新的轉換運算符 ,即隐式/顯示轉換運算符

邏輯運算符必須成對重載==和!=

指派運算符=不能被重載, +=也屬于指派運算符

重載操作符文法

        //operator是運算符重載的關鍵字

重載操作符文法

        //重載二進制運算符

重載操作符文法

        public static ThreeD operator +(ThreeD op1, ThreeD op2)

重載操作符文法
重載操作符文法
重載操作符文法

{

重載操作符文法

            ThreeD result = new ThreeD();

重載操作符文法

            result.x = op1.x + op2.x;

重載操作符文法

            result.y = op1.y + op2.y;

重載操作符文法

            result.z = op1.z + op2.z;

重載操作符文法
重載操作符文法

            return result;

重載操作符文法

        }

重載操作符文法
重載操作符文法

        //可以多次重載同一運算符

重載操作符文法

        public static ThreeD operator -(ThreeD op1, ThreeD op2)

重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法

            result.x = op1.x - op2.x;

重載操作符文法

            result.y = op1.y - op2.y;

重載操作符文法

            result.z = op1.z - op2.z;

重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法

        //重載一進制運算符

重載操作符文法

        public static ThreeD operator -(ThreeD op)

重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法

            result.x = -op.x;

重載操作符文法

            result.y = -op.y;

重載操作符文法

            result.z = -op.z;

重載操作符文法
重載操作符文法
重載操作符文法

對象+整型 與 整型 + 對象 是不一樣的,是以要重載兩次:

重載操作符文法

        public static ThreeD operator +(ThreeD op1, int op2)

重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法

            result.x = op1.x + op2;

重載操作符文法

            result.y = op1.y + op2;

重載操作符文法

            result.z = op1.z + op2;

重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法

        public static ThreeD operator +(int op1, ThreeD op2)

重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法

            result.x = op1 + op2.x;

重載操作符文法

            result.y = op1 + op2.y;

重載操作符文法

            result.z = op1 + op2.z;

重載操作符文法
重載操作符文法
重載操作符文法

重載關系運算符要“成對重載”,比如說<和>,不能隻重載其中重載一個。先重載<,然後可以利用<重載>:

重載操作符文法

        public static bool operator <(ThreeD op1, ThreeD op2)

重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法

            if ((op1.x < op2.x) && (op1.y < op2.y) && (op1.z < op2.z))

重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法

                return true;

重載操作符文法

            }

重載操作符文法

            else

重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法

                return false;

重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法

        public static bool operator >(ThreeD op1, ThreeD op2)

重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法

            if (op1 < op2)

重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法
重載操作符文法

關系運算符==,重載時候需要同時覆寫Equal(object)方法和GetHashCode()方法,如下:

        public static bool operator ==(ThreeD a, ThreeD b)

重載操作符文法

            // If both are null, or both are same instance, return true.

            if (System.Object.ReferenceEquals(a, b))

重載操作符文法

            // If one is null, but not both, return false.

            if (((object)a == null) || ((object)b == null))

重載操作符文法

            // Return true if the fields match:

            return a.x == b.x && a.y == b.y && a.z == b.z;

        public static bool operator !=(ThreeD op1, ThreeD op2)

重載操作符文法

            return !(op1 == op2);

        public override bool Equals(Object obj)

重載操作符文法

            if (obj == null)

重載操作符文法

            ThreeD p = obj as ThreeD;

            if ((object)p == null)

重載操作符文法

            return ((this.x == p.x) && (this.y == p.y) && (this.z == p.z));

        public override int GetHashCode()

重載操作符文法

            return x ^ y ^ z;

重載true和false,也要成對出現,同上。可以認為true/false也是運算符。

重載邏輯運算符,一共5個:&    |    !    &&    ||

!隻是對true的取反,很容易實作。

&&與||是不能被重載的,編譯器會報錯。隻有通過實作&與|的重載,還要實作true與false的重載,同時滿足:

    重載的&與|的傳回類型與參數類型必須是    重載運算符的類型。

實作如下:ThreeD定義見前面

        public static ThreeD operator &(ThreeD op1, ThreeD op2)

重載操作符文法

            if ((op1.x != 0) && (op1.y != 0) && (op1.z != 0) &

                (op2.x != 0) && (op2.y != 0) && (op2.z != 0)

                )

重載操作符文法

                return new ThreeD(1, 1, 1);

重載操作符文法

                return new ThreeD(0, 0, 0);

這樣,&&與||對象自動可用,操作如下:如果重載的true(對應||)或false(對應&&)檢驗第一個操作數,如果它能确定運算的結果,那麼直接傳回,否則,使用相應的重載&或|來判斷結果——短路運算符的原理。

轉換運算符:

有兩種:隐式(implicit)和顯示(explicit)

implicit轉換,自動調用轉換方法。

explicit轉換,要強制轉換類型。

        public static implicit operator int(ThreeD op)

重載操作符文法

            return op.x * op.y * op.z;

        public static explicit operator String(ThreeD op)

重載操作符文法

            return op.x.ToString() + op.y.ToString() + op.z.ToString();

        static void Main(string[] args)

重載操作符文法

            int i = c;

            String s = (String)c;

轉換操作符的限制:

    不能定義從double到int的類型轉換,可以實作自定義類型與系統類型的轉換。

    不能定義Object和其他自定義類型的轉換。

    不能給相同的源和目标同時定義implicit和explicit轉換。

    不能定義基類到派生類的轉換。

    不能定義接口到其他類型的轉換。

implicit和explicit的選擇:

    隐式轉換至用于與在轉換不會引起錯誤的環境,滿足以下兩條才建立隐式轉換:

        1.不丢失資訊,如截斷/溢出/丢失正負号

        2.轉換不會引起異常。

複合運算符不能被重載,因為它們總是被分解開來,如+= ,但是,如果已經重載了+,那麼+=就自動可以使用