• 天轰穿C# vs2010 04面向对象的编程之运算符重载的示例【原创】


    小天:别总是光说不练好不好,来点实际的吧。我都习惯了从例题中学习,而不是看概念学习了。

    老田:哎,下面就来开发一个结构Record,来演示运算符重载,第一个重载是复写了ToString方法。

    using System;

     

    namespace operator_overload

    {

        public struct Record  //注意,这里是结构

        {

            private int x, y;

            public Record(int num1, int num2)

            {

                x = num1;

                y = num2;

            }

            ///<summary>

            ///复写ToString方法,在界面上例题一

            ///</summary>

            ///<returns></returns>

            public override string ToString()

            {

                string str=string.Format("[{0},{1}]", x, y);

                return str;

                //上面这两句按照如下形式写更节约,想下为什么

                //return string.Format("[{0},{1}]", x, y);

            }

        }

    }

    接下来,使用这个方法,在Button_Click1事件中写如下代码

            private void button1_Click(object sender, EventArgs e)

            {

                //创建两个Record对象

                Record r1 = new Record(200, 300);

                Record r2 = new Record(30, 60);

                //看下这两个的显示情况

                MessageBox.Show("r1=" + r1.ToString() + " , r2=" + r2.ToString() + "");

                //上面这句显示结果为r1 = [200,300] , r2=[30,60]

            }

           小天:如何重载符号呢?我刚才试了几种都不行哦。我希望直接在代码中用r1加或者减r2,以得到值。

           老田:如下,我们继续在Record结构中添加代码,以重载 +

            ///<summary>

            ///重载 + 运算符

            ///</summary>

            ///<param name="r1">Record 对象 1</param>

            ///<param name="r2">Record 对象 2</param>

            ///<returns>已经执行运算后的新的 Record 对象</returns>

            public static Record operator +(Record r1, Record r2)

            {

                //用传入的参数r1r2xy这两个字段分别相加,并实例成一个新的record对象返回出去

                return new Record(r1.x + r2.x, r1.y + r2.y);

            }

            ///<summary>

            ///重载 - 运算符

            ///</summary>

            ///<param name="r1">Record 对象 1</param>

            ///<param name="r2">Record 对象 2</param>

            ///<returns>已经执行运算后的新的 Record 对象</returns>

            public static Record operator -(Record r1, Record r2)

            {

                //用传入的参数r1r2xy这两个字段分别相减,并实例成一个新的record对象返回出去

                return new Record(r1.x - r2.x, r1.y - r2.y);

            }

           接下来,我们在示例窗体上再添加一个按钮,双击产生Button_Click2事件,并输入如下代码

            private void button2_Click(object sender, EventArgs e)

            {

                //创建两个Record对象

                Record r1 = new Record(200, 300);

                Record r2 = new Record(30, 60);

                //申明r3r4分别等于r1r2相加、减之后的新对象

                Record r3 = r1 + r2;

                Record r4 = r1 - r2;

                MessageBox.Show("r3=" + r3.ToString() + " , r4=" + r4.ToString() + "");

                //上面这句显示结果为r3 = [230,340] , r4=[170,240]

            }

           小天:上面的这段代码看起来并没有什么特色啊。

           老田:是没有特色,不过你想下+-号什么时候可以应用于对象的加减了呢?

           小天:哦明白了,+- 号通常只应用与预定义数值类型之间的运算,这里我们重载了之后居然可以对对象执行加减运算了。

    对了,你上面说,+=-=不能重载,但是只要+-这两给被重载了,那么+=-=也就同时拥有了新功能,这是真的吗?怎么来试用下看看?

    老田:那多简单啊,在窗体上再增加一个按钮,双击在Button_Click3事件中编写如下代码

            private void button3_Click(object sender, EventArgs e)

            {

                //-=

                Record r1 = new Record(200, 300);           

                Record r2 = new Record(30, 60);

                r1-=r2;

                MessageBox.Show(r1.ToString());

                //+=

                Record r3 = new Record(200, 300);

                Record r4 = new Record(30, 60);

                r3 += r4;

                MessageBox.Show(r3.ToString());

            }

           老田:好吧,你练习吧,至少练习10个运算符哦,还有就是将前面所学的知识都融合起来。

    本文章为天轰穿原创作品,转载请注明出处及作者。 

  • 相关阅读:
    BZO4197 & 洛谷2150 & UOJ129:[NOI2015]寿司晚宴——题解
    BZOJ4198 & 洛谷2168 & UOJ130:[NOI2015]荷马史诗——题解
    BZOJ4651 & 洛谷1173 & UOJ220:[NOI2016]网格——题解(附debug数据)
    BZOJ4653 & 洛谷1712 & UOJ222:[NOI2016]区间——题解
    BZOJ4898 & BZOJ5367 & 洛谷3778:[APIO2017]商旅——题解
    BZOJ5340 & 洛谷4564 & LOJ2552:[CTSC2018]假面——题解
    举例分析 Makefile 中的 patsubst、wildcard、notdir 函数
    伪指令 ENTRY 与 END
    伪指令 ADR 与 LDR 的区别
    μC/OS-II 信号量集
  • 原文地址:https://www.cnblogs.com/thcjp/p/2847535.html
Copyright © 2020-2023  润新知